在双跃点SSH会话中重定向使用Plink执行的命令输出

时间:2018-03-10 02:01:17

标签: shell batch-file ssh putty plink

从我的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

更具体地说,它似乎是重定向部分,因为当我删除重定向时,我能够回显到控制台。

1 个答案:

答案 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脚本中。