通过 ssh 传递环境变量

通过 ssh 传递环境变量

我正在尝试使用以下代码将环境变量传递给远程主机。

ssh username@ip "env current_quarter=$current_quarter" sh -s << 'EOF' 
pwd 
echo "${current_quarter}" 
EOF

pwd打印远程主机上的正确位置,但echo "${current_quarter}"不打印 current_quarter。

答案1

通过添加EOF引号,您可以告诉本地 shell 在将此处的文档传递给 ssh 之前不要对其进行扩展。根据bash 文档这适用于参数扩展、命令替换和算术扩展。

与我最初写这个答案时的想法相反,远程 shell 不会受到此影响,并且会像您直接在远程 shell 中编写的那样执行此处的文档(包括通过引用在本地 shell 中跳过的所有类型的扩展和替换EOF)。

如果您只想使用局部变量,test可以从 EOF 中删除引号:

ssh user@host sh -s <<EOF
pwd
echo $test
EOF

对于鱼类用户来说它看起来像这样:

ssh user@host "\
pwd
echo $test
"

现在,如果您想将局部变量test作为远程变量传递remote_test而不是在本地扩展,则只需使用反斜杠转义变量:

ssh user@host sh -s <<EOF
export remote_test=$test
pwd
echo "\${remote_test}"
EOF

编辑:

跑步:

ssh user@host "env remote_test=$test" sh -s <<'EOF'
pwd
echo "${remote_test}"
EOF

应该等同于第三个代码示例,不同之处在于它env不是 shell 的一部分,也可以在非 bourne shell 中使用。

(然而,这与 OP 给出的代码示例相同,但由于 OP 将这个答案标记为正确,我怀疑 env 和 export 在遇到某些字符序列时会表现不同,但我没有找到支持这一假设的确凿证据。)

相关内容