gpt4 book ai didi

linux - 远程 ssh 命令 : first echo output is lost

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:28 31 4
gpt4 key购买 nike

我试图通过 ssh 1-liner 调用在远程机器上运行多个命令,方法是将它们指定为传递给“bash -c”的以分号分隔的字符串。它适用于某些情况,但不适用于其他情况。检查一下:

# Note: the "echo 1" output is lost:
bash-3.2$ ssh sandbox bash -c "echo 1; echo 2; echo 3"

2
3

# Note: first echo is ignored again
bash-3.2$ ssh sandbox bash -c "echo 0; echo 1; echo 2; echo 3"

1
2
3

# But when we run other commands (for example "date") then nothing is lost
bash-3.2$ ssh sandbox bash -c "date; date;"
Wed Nov 7 20:27:55 UTC 3018
Wed Nov 7 20:27:55 UTC 3018

我错过了什么?

远程操作系统:Ubuntu 16.04.5 LTS
远程 ssh:OpenSSH_7.2p2 Ubuntu-4ubuntu2.4,OpenSSL 1.0.2g 2016 年 3 月 1 日

本地操作系统:macOS High Sierra Versoin 10.13.3
本地 ssh:OpenSSH_7.6p1、LibreSSL 2.6.2

更新:上面的示例是我正在尝试做的事情的高度简化图。实际应用实际上是通过回显到远程文件系统来在远程机器上生成几个文件:

#!/bin/bash

A=a
B=b
C=c

ssh -i ~/.ssh/${REMOTE_FQDN}.pem ${REMOTE_FQDN} sudo bash -c \
"echo $A > /tmp/_a; echo $B > /tmp/_b; echo $C > /tmp/_c;"

运行上述脚本并转到远程框检查结果后,我看到以下内容:

root@sandbox:/tmp# for i in `find ./ -name '_*'|sort`; do echo "----- ${i} ----"; cat $i; done
----- ./_a ----

----- ./_b ----
b
----- ./_c ----
c

如您所见,第一个“echo”命令生成了空白文件!

最佳答案

需要明确的是,这里有 3 个 shell 在工作 - 一个解释 ssh,即您的本地 shell; ssh 将自动为您运行的那个,以及您显式调用的 bash

1 “消失”的原因是解释 ssh 命令的 shell “吃掉”了 -c 参数周围的引号,然后 shell ssh另一 端在空格处拆分参数。所以它最终看起来像 bash -c echo 1 ; echo 2; echo 3。反过来,-c 只是得到 echo,它回显一个空行; 1 成为该 shell 的 $1 的值,它未被使用。然后内部bash返回,直接ssh shell运行echo 2;正常回显 3

考虑一下:

$ ssh xxx bash -c "'echo 1'; echo 2; echo 3"
1
2
3

其中 echo 1 在 ssh 参数中受到保护,因此第二级 ssh shell 被传递 bash -c 'echo 1'; echo 2; echo 3。最里面的第 3 级 shell 回显 1,然后第 2 层 ssh shell 回显 2 和 3。

这是另一个有趣的排列:

$ ssh xxx bash -c "'echo 1; echo 2; echo 3'"
1
2
3

在这里,内壳获得所有 echo ,因为它们在第一个壳内由 " 分组,在第二个壳内由 ' 分组。

通常,将参数传递给运行 shell 脚本的 shell 脚本的 shell 脚本可能非常难以构建。我建议你稍微改变一下你的技术,这样可以省去很多精力。不是将 shell 命令作为命令行参数传递给 ssh 参数,而是通过标准输入将其提供给 shell。考虑使用这样的管道,避免递归 shell 解释:

$ echo "echo 1; echo 2; echo 3" | ssh -T xxx
1
2
3

(这里,-T 只是为了抑制 ssh 提示缺少伪终端)。

关于linux - 远程 ssh 命令 : first echo output is lost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197450/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com