首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌套的远程命令中正确转义$

在嵌套的远程命令中正确转义$
EN

Stack Overflow用户
提问于 2016-07-28 02:28:11
回答 1查看 166关注 0票数 0

我想从另一台远程主机在另一台远程主机上执行命令。

代码语言:javascript
复制
HOST1=host1.domain.tld
HOST2=host2.domain.tld

HOST1用于连接到HOST2,该命令在HOST2上执行。远程命令依赖于在HOST2上计算的变量。

代码语言:javascript
复制
ssh -A $HOST1 -C "x=wrong; ssh -A $HOST2 -C "x=right; echo \$x""

奇怪的是,上面的命令返回$x,而下一个命令返回wrong而不是空行。

代码语言:javascript
复制
ssh -A $HOST1 -C "x=wrong; ssh -A $HOST2 -C "echo \$x""

问题1:为什么第一个命令会给出$x

问题2:保留双引号,如何让它打印right

EN

回答 1

Stack Overflow用户

发布于 2016-07-28 05:45:50

第1部分:字面答案

...to准确地回答了这个问题。

为什么第一个命令会给出$x

请记住,此命令会多次执行,因此会被多个shell转换。该转换如下所示(假设HOST1为1.1.1.1,HOST2为2.2.2.2):

代码语言:javascript
复制
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字:

代码语言:javascript
复制
# 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

反斜杠-转义嵌套的引号,这样它们就不会结束你想放在外部的引号。

代码语言:javascript
复制
ssh -A $HOST1 -C "x=wrong; ssh -A $HOST2 -C \"x=right; echo \$x\""

第2部分:最佳实践替代方案

SSH - ProxyCommand

在实践中,根本不要执行这种显式的嵌套ProxyCommand调用--只需使用SSH ssh配置选项:

代码语言:javascript
复制
ssh \
  -o "ProxyCommand ssh $HOST1 netcat -w 120 %h %p' \
  "$HOST2" 'x=right; echo "$x"'

Bash - nestable eval-safe报价生成

通常,尝试手动转义比让shell为您转义更容易出错。

代码语言:javascript
复制
host2_cmd='x=right; echo "$x"'
printf -v host1_cmd '%q ' ssh -A "$HOST2" -C "$host2_cmd"
ssh "$HOST1" bash -s <<<"$host1_cmd"

为了演示,我们甚至可以在第三个主机上这样做:

代码语言:javascript
复制
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解析时,它将计算出当前内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38620603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档