ssh 时如何将环境传递到远程机器

ssh 时如何将环境传递到远程机器

我想执行这样的命令:

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 2echo 12echo12

看来您想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 中单引号或转义整个命令行?

相关内容