我想执行这样的命令:
ssh remote_host export ENV_1=a && echo $ENV_1
但结果 ENV_1 是空的,我做错了什么吗?谢谢
答案1
ENV_1
为空,因为它属于ENV_1
你的本地 shell。&&
代码中的 是由你的本地 shell 解释的和 $ENV_1
将被你的本地 shell 替换。
ssh
足够智能,可以根据多个参数构建远程命令。例如:
ssh remote_host 'echo 1 2'
ssh remote_host 'echo 1' 2
ssh remote_host echo 1 2
远程命令将在每种情况下出现,但它将分别由(1 个参数) 或, (2 个参数) 或, , (3 个参数)echo 1 2
构建。还有更多可能性。echo 1 2
echo 1
2
echo
1
2
看来您想export ENV_1=a && echo $ENV_1
成为远程命令。好吧,您的本地 shell 看到&&
并将整行解释为ssh … && echo $ENV_1
。
您应该转义或引用该变量&&
以保护它免受本地 shell 的攻击。但是如果您不执行任何其他操作,它$ENV_1
仍将被本地 shell 替换(用空字符串替换)。您还需要转义$
或用单引号括住该变量。
最好的办法是引用整个远程命令。您不希望变量在本地扩展,因此至少$ENV_1
应该用单引号引起来。在您想要的命令中,没有什么不应该用单引号引起来,您可以将整个远程命令用单引号引起来。但是当它到达远程 shell 时,变量应该用双引号引起来。 所以这:
ssh remote_host 'export ENV_1=a && echo "$ENV_1"'
该变量不会在本地扩展,因为外部引号很重要。局部单引号是外面的引号。
您可以在我的回答中找到更广泛的分析如何通过 ssh 执行复杂的命令行?
如果你的本地 shell 是 Bash,则检查如何方便地在 Bash 中单引号或转义整个命令行?