gpt4 book ai didi

bash - 捕获远程 ssh 命令失败的输出

转载 作者:行者123 更新时间:2023-12-02 14:17:49 25 4
gpt4 key购买 nike

我正在尝试在 bash 脚本中捕获远程执行命令的输出,以便脚本可以对结果进行一些处理,并且对结果感到困惑:

$ COMMAND="ssh localhost \"echo 'hello'\""
$ OUTPUT=$($COMMAND)
bash: echo 'hello': command not found

使用反引号会产生稍微不同的结果:
$ `ssh localhost "echo 'hello'"`
-bash: hello: command not found

但是该命令在没有任何包装器的情况下按我预期的方式运行:
$ ssh localhost "echo 'hello'"
hello

我怀疑我误解了关于如何执行这些命令的一些非常基本的东西。我在这里做错了什么,还是有更好的方法来做到这一点?

最佳答案

问题

执行以下操作时不会评估引号 ( "..." ):

$($COMMAND)

远程 Bash 看到的是两个参数: "echo'hello'" ,而不是 echo 'hello'如您所料。

建议的解决方案:数组

在您的情况下,我建议使用数组:
COMMAND=( ssh localhost "echo 'hello'" )
OUTPUT=$( "${COMMAND[@]}" )
(...) 中的单词是数组的元素。在这种情况下, echo 'hello'被视为单个元素:在赋值期间立即评估引号。然后,当你做 "${COMMAND[@]}" ,每个元素都将作为原样传递。

还有其他几种方法可以解决这个问题,比如使用 eval以便评估引号,但根据我的经验,使用数组是构建和执行命令的最安全和最简单的方法。使用数组很容易防止外壳注入(inject)攻击,防止不必要的扩展,防止有空格时单词被破坏。唯一的缺点是数组并非在每个 shell 中都可用。

问题的解释

原因是扩展(即 $COMMAND )不评估引号。

这个简单的例子证明了这一点,我们每行打印一个参数:
$ COMMAND="ssh localhost \"echo 'hello'\""
$ for x in $COMMAND; do echo "$x"; done
ssh
localhost
"echo
'hello'"

通过使用数组来代替:
$ COMMAND=( ssh localhost "echo 'hello'" )
$ for x in "${COMMAND[@]}"; do echo "$x"; done
ssh
localhost
echo 'hello'

使用数组, echo 'hello'在一行上(即它是一个参数),用一个简单的字符串代替 "echo'hello'"是 split 的。

关于bash - 捕获远程 ssh 命令失败的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54206943/

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