# 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]
8条答案
按热度按时间dfty9e191#
如果您使用
代替
shell将在向远程主机发送命令字符串之前插入
$BUILD_NUMBER
。dgenwo3n2#
不计算单引号中的变量。请使用双引号:
shell会用双引号展开变量,但不会用单引号。在传递给
ssh
命令之前,这将变成您想要的字符串。11dmarpk3#
您可以直接通过
ssh
命令的标准输入和来自远程位置的read
命令输入数据。在下面的示例中,
1.一个索引数组(为了方便)被填充了你想要在远程端检索其值的变量的名称。
1.对于其中的每个变量,我们给
ssh
一个以空值结尾的行,给出变量的名称和值。1.在
shh
命令本身中,我们循环通过这些行来初始化所需的变量。输出:
如果您不需要
export
这些,您应该能够使用declare
而不是export
。一个 * 真正简化的版本 *(如果你不需要可扩展性,只有一个变量要处理,等等)看起来像这样:
oug3syen4#
默认情况下,SSHD上接受的环境变量列表包括
LC_*
。daupos2t5#
通过ssh显式传递环境变量也是可能的,它确实需要一些服务器端的设置,所以这不是一个通用的答案。
在我的例子中,我希望将备份存储库加密密钥传递给备份存储服务器上的命令,而不将该密钥存储在那里,但请注意,任何环境变量在
ps
中都可见!在stdin上传递密钥的解决方案也可以工作,但我发现它太麻烦了。在任何情况下,下面是如何通过ssh传递环境变量:在服务器上,编辑
sshd_config
文件(通常为/etc/ssh/sshd_config
),并添加与要传递的变量相匹配的AcceptEnv
指令。请参见man sshd_config
。在我的示例中,我希望将变量传递给博格backup,因此我选择了:现在,在客户机上使用
-o SendEnv
选项发送环境变量。以下命令行设置环境变量BORG_SECRET
,然后将其标记为发送到客户机(称为backup
)。然后在那里运行printenv
并过滤博格变量的输出:yb3bgrhw6#
转义变量以便访问ssh会话外部的变量:ssh pvt@192.168.1.133“~/工具/myScript.pl$构建版本编号”
j2cgzkjk7#
正如前面所回答的,您不需要在远程主机上设置环境变量,而只需在本地主机上执行元扩展,并将值传递给远程主机即可。
如果确实要在远程主机上设置环境变量并使用它,可以使用
env
程序在本例中,这有点矫枉过正,注意
env BUILD_NUMBER=$BUILD_NUMBER
在本地主机上执行 meta扩展BUILD_NUMBER
环境变量将由使用遥控器 shell
ie3xauqp8#
如果您需要从特定的shell运行它,可以执行以下操作: