从我的Windows系统,我通过SSH连接到远程系统[remote1],然后连接到remote1连接到的另一个远程系统[remote2],但我的Windows系统却没有。
这是一个有效的例子;
plink -ssh -pw password -batch root@remote1 ssh remote2 "sed -i 's/param=.*/param=newValue/' /root/test.txt"
此例程通过Plink连接到remote1,然后通过ssh
连接到remote2,然后检查字符串param=
,如果存在,则将其替换为param=newValue
。再次,这是有效的。
这是不起作用的;
plink -ssh -pw password -batch root@remote1 ssh remote2 "grep -q -F 'param=newValue' /root/test.txt || echo 'export param=newValue' >> /root/test.txt"
此例程以相同的方式连接到remote1和remote2,然后搜索param=newValue
,如果它不存在,则将param=newValue
附加到文件的末尾。当我在Windows命令行上运行它时,它需要几秒钟然后退出而没有错误,但test.txt
文件保持不变。
如果我使用putty远程访问remote1,然后从ssh remote2 "grep ...
开始运行相同的命令,那么它会附加test.txt
文件。
我尝试过转发|
和>
,但都没有奏效。
我已经确定命令的后半部分是失败的部分。
echo 'export param=newValue' >> /root/test.txt
更具体地说,它似乎是重定向部分,因为当我删除重定向时,我能够回显到控制台。
答案 0 :(得分:1)
据说双引号在某个早期阶段(当执行Plink时已经丢失)丢失,使得重定向已经在第一台服务器上发生了。
考虑使用不同的方法向Plink提供命令。
使用-m
开关(推荐):
plink -ssh -pw password -batch root@remote1 ssh remote2 -m command.txt
command.txt
包含
grep -q -F 'param=newValue' /root/test.txt || echo 'export param=newValue' >> /root/test.txt
或使用输入重定向:
plink -ssh -pw password -batch -T root@remote1 ssh remote2 < command.txt
请注意-T
开关,它确保以非交互模式启动shell - 与在命令行上指定命令时使用的模式相同(如您原来想要的那样)或使用{{1切换(如上所述)。
通常,当您使用输入重定向提供命令时,将启动交互式shell会话。
即使使用-m
切换,在命令行或使用-T
开关提供命令时,仍然使用“shell”SSH通道执行命令,与“exec”SSH通道相反。所以你会遇到一些不同之处。
或者您可以将命令存储在任一服务器上的shell脚本中。