我正在尝试使用通过Plink建立的SSH会话将命令输出发送到远程主机。我当前的命令如下所示(无限循环是故意的:
(for /l in %n (1,0,2) do ping 1.1.1.1 -n -w 1000 >nul & echo %RANDOM%) | plink.exe sessionName -l %user "cat > outputfile.txt"
我希望outputfile.txt包含一个随机生成的数字,但它包含这个:
C:\(PATH)> ping 1.1.1.1 -n 1 -w 1000 1>nul & echo 9001
为什么要发送整个命令,而不仅仅是随机数?
另外,它还附加到远程文件而不是重写。远程主机是基于Linux的,所以我希望它能重写文件,因为我正在使用>而不是>>。
答案 0 :(得分:3)
管道为任一侧创建cmd.exe
实例,其中for
为每次迭代回显其正文代码。为了避免这种情况,请在每个命令前加@
,或将整个主体包含在()
中,并在左括号前加@
,如下所示......:
for /L %n in (1,0,2) do @ping 1.1.1.1 -n -w 1000 >nul & @echo %RANDOM%
分别是......或者这个:
for /L %n in (1,0,2) do @(ping 1.1.1.1 -n -w 1000 >nul & echo %RANDOM%)
in
命令行中缺少for /L
关键字,必须阅读:
for /L %n in (1,0,2) do
for /L
循环定义了一个无限循环(我不确定您是否打算这样做),除非您将步长值更改为1
,如:
for /L %n in (1,1,2) do
要使用batch-file中的代码(根据代码),您需要将%
符号加倍,例如:
for /L %%n in (1,1,2) do
在plink
部分,有不平衡的标志和引号。对于本文的其余部分,我认为应该阅读(因为我不知道该工具):
plink -l %user%
每次循环迭代返回的随机数都是相同的,因为一旦整个命令行被解析,变量%RANDOM%
就会扩展为(替换为)一个随机数,除非你强制{ {3}}:
cmd /V /C "for /l %%n in (1,1,2) do @(ping 1.1.1.1 -n -w 1000 >nul & echo !RANDOM!)" | plink -l %user% > "outputfile.txt"