Shell 在双跳SSH会话上重定向使用Plink执行的命令输出
在我的Windows系统中,我通过SSH连接到一个远程系统[remote1],然后连接到另一个远程系统[remote2],remote1可以连接到该系统,但我的Windows系统没有 这是一个有效的例子Shell 在双跳SSH会话上重定向使用Plink执行的命令输出,shell,batch-file,ssh,putty,plink,Shell,Batch File,Ssh,Putty,Plink,在我的Windows系统中,我通过SSH连接到一个远程系统[remote1],然后连接到另一个远程系统[remote2],remote1可以连接到该系统,但我的Windows系统没有 这是一个有效的例子 plink -ssh -pw password -batch root@remote1 ssh remote2 "sed -i 's/param=.*/param=newValue/' /root/test.txt" 此例程通过Plink连接到remote1,然后通过ssh连接到remote2
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
更具体地说,它似乎是重定向部分,因为当我删除重定向时,我能够回显到控制台。据说双引号在某个早期阶段(已经执行Plink时)丢失,使得重定向已经在第一台服务器上发生 考虑使用不同的方法向Plink提供命令
- 使用
开关(推荐): 带有-m
包含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
请注意plink-ssh-pw密码-batch-Troot@remote1ssh remote2
开关,它确保shell以非交互模式启动-与在命令行上指定命令时使用的模式相同(如您最初所需)或使用-T
开关(如上所述) 通常,当您使用输入重定向提供命令时,将启动交互式shell会话 即使使用-m
开关,当在命令行上提供命令或使用-T
开关时,命令仍然使用“shell”SSH通道执行,与“exec”SSH通道相反。因此,您会遇到一些差异-m
- 或者,您可以将任一服务器上的命令存储到shell脚本中
ssh…
部分移动到一个文件中,并使用Plink的-m
开关?使用一个没有-m开关的文件是一个好主意。谢谢。好的,我假设您选择了使用输入重定向,对吗?请注意,这有一点不同。请参阅我的答案。
plink -ssh -pw password -batch -T root@remote1 ssh remote2 < command.txt