我想从另一台远程主机在另一台远程主机上执行命令。
HOST1=host1.domain.tld
HOST2=host2.domain.tldHOST1用于连接到HOST2,该命令在HOST2上执行。远程命令依赖于在HOST2上计算的变量。
ssh -A $HOST1 -C "x=wrong; ssh -A $HOST2 -C "x=right; echo \$x""奇怪的是,上面的命令返回$x,而下一个命令返回wrong而不是空行。
ssh -A $HOST1 -C "x=wrong; ssh -A $HOST2 -C "echo \$x""问题1:为什么第一个命令会给出$x
问题2:保留双引号,如何让它打印right
发布于 2016-07-28 05:45:50
第1部分:字面答案
...to准确地回答了这个问题。
为什么第一个命令会给出$x
请记住,此命令会多次执行,因此会被多个shell转换。该转换如下所示(假设HOST1为1.1.1.1,HOST2为2.2.2.2):
ssh -A 1.1.1.1 -C "x=wrong; ssh -A 2.2.2.2. -C "x=right; echo \$x""
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^...note的箭头?它们显示了您的报价区域的开始和结束位置:您在x=right之前的报价是在x=wrong之前开始的报价!
因此,此标记为两个单独的命令,每行写出一个shell字:
# command one: ssh
ssh \
-A \
1.1.1.1 \
-C \
"x=wrong; ssh -A 2.2.2.2. -C "x=right;
# command two: echo
echo \
\$x""保留双引号,我如何让它打印right
反斜杠-转义嵌套的引号,这样它们就不会结束你想放在外部的引号。
ssh -A $HOST1 -C "x=wrong; ssh -A $HOST2 -C \"x=right; echo \$x\""第2部分:最佳实践替代方案
SSH - ProxyCommand
在实践中,根本不要执行这种显式的嵌套ProxyCommand调用--只需使用SSH ssh配置选项:
ssh \
-o "ProxyCommand ssh $HOST1 netcat -w 120 %h %p' \
"$HOST2" 'x=right; echo "$x"'Bash - nestable eval-safe报价生成
通常,尝试手动转义比让shell为您转义更容易出错。
host2_cmd='x=right; echo "$x"'
printf -v host1_cmd '%q ' ssh -A "$HOST2" -C "$host2_cmd"
ssh "$HOST1" bash -s <<<"$host1_cmd"为了演示,我们甚至可以在第三个主机上这样做:
host3_cmd='x=right; echo "$x"'
printf -v host2_cmd '%q ' ssh -A "$HOST3" -C "$host3_cmd"
printf -v host1_cmd '%q ' ssh -A "$HOST2" -C "$host2_cmd"
ssh "$HOST1" bash -s <<<"$host1_cmd"这之所以有效,是因为在ksh和bash中,printf %q以这样一种方式引用字符串,即在由同一个shell解析时,它将计算出当前内容。
https://stackoverflow.com/questions/38620603
复制相似问题