【问题标题】:Redirecting an output of command executed using Plink on double-hop SSH session在双跳 SSH 会话上重定向使用 Plink 执行的命令的输出
【发布时间】:2018-03-10 02:01:16
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试将ssh ... 部分移动到文件并使用Plink 的-m 开关?
  • 使用文件的好主意,无需 -m 开关即可工作。谢谢。
  • 好的,我假设您选择使用输入重定向,对吧?请注意,尽管存在差异。看我的回答。

标签: shell batch-file ssh putty plink


【解决方案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 以非交互模式启动 - 与在命令行上指定命令时使用的模式相同(就像您最初想要的那样)或使用-m 开关(同上)。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多