我正在尝试使用以下代码将环境变量传递给远程主机。
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 在遇到某些字符序列时会表现不同,但我没有找到支持这一假设的确凿证据。)