Answers:
如果您使用
ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"
代替
ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'
您的外壳程序将$BUILD_NUMBER
在将命令字符串发送到远程主机之前进行插值。
(据我所知,这个答案似乎不必要地复杂,但是就空格和特殊字符而言,它很容易扩展和增强。)
您可以直接通过ssh
命令的标准输入以及read
从远程位置输入数据。
在以下示例中,
ssh
一个以空值结尾的行,该行给出了变量的名称和值。shh
命令本身中,我们遍历这些行以初始化所需的变量。# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb
# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
FOO
BAR
)
for name in "${VAR_NAMES[@]}"
do
printf '%s %s\0' "$name" "${!name}"
done | ssh user@somehost.com '
while read -rd '"''"' name value
do
export "$name"="$value"
done
# Check
printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'
输出:
FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]
如果您不需要export
这些,则应该可以使用declare
代替export
。
一个真正简化的版本(如果您不需要扩展性,只需处理一个变量,等等)将如下所示:
$ ssh user@somehost.com 'read foo' <<< "$foo"
如前所述,您无需在远程主机上设置环境变量。相反,您可以仅在本地主机上进行元扩展,然后将值传递给远程主机。
ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'
如果您确实想在远程主机上设置环境变量并使用它,则可以使用该env
程序
ssh pvt@192.168.1.133 "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"
在这种情况下,这有点过头了,请注意
env BUILD_NUMBER=$BUILD_NUMBER
在本地主机上进行元扩展BUILD_NUMBER
环境变量将由也可以通过ssh显式传递环境变量。它确实需要通过一些服务器端设置,因此这不是一个通用的答案。
就我而言,我想将备份存储库加密密钥传递给备份存储服务器上的命令,而不必将该密钥存储在其中,但是请注意,任何环境变量在中都是可见的ps
!在stdin上传递密钥的解决方案也可以,但是我发现它太麻烦了。无论如何,这是通过ssh传递环境变量的方法:
在服务器上,sshd_config
通常,编辑文件/etc/ssh/sshd_config
并添加AcceptEnv
与要传递的变量匹配的指令。请参阅man sshd_config
。就我而言,我想将变量传递给borg备份,因此我选择了:
AcceptEnv BORG_*
现在,在客户端上,使用该-o SendEnv
选项发送环境变量。以下命令行设置了环境变量BORG_SECRET
,然后标记了该变量以将其发送到客户端计算机(称为backup
)。然后在printenv
此处运行并过滤BORG变量的输出:
$ BORG_SECRET=magic-happens ssh -o SendEnv=BORG_SECRET backup printenv | egrep BORG
BORG_SECRET=magic-happens