Shell 在双跳SSH会话上重定向使用Plink执行的命令输出

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

在我的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,然后检查字符串
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
    请注意
    -T
    开关,它确保shell以非交互模式启动-与在命令行上指定命令时使用的模式相同(如您最初所需)或使用
    -m
    开关(如上所述)

    通常,当您使用输入重定向提供命令时,将启动交互式shell会话

    即使使用
    -T
    开关,当在命令行上提供命令或使用
    -m
    开关时,命令仍然使用“shell”SSH通道执行,与“exec”SSH通道相反。因此,您会遇到一些差异

  • 或者,您可以将任一服务器上的命令存储到shell脚本中


您是否尝试将
ssh…
部分移动到一个文件中,并使用Plink的
-m
开关?使用一个没有-m开关的文件是一个好主意。谢谢。好的,我假设您选择了使用输入重定向,对吗?请注意,这有一点不同。请参阅我的答案。
plink -ssh -pw password -batch -T root@remote1 ssh remote2 < command.txt