在远程 ssh 命令中传递变量
- 2024-10-29 08:34:00
- admin 原创
- 44
问题描述:
我希望能够使用 ssh 从我的机器运行命令并传递环境变量$BUILD_NUMBER
这是我正在尝试的:
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
在进行 ssh 调用的机器上设置,并且由于该变量在远程主机上不存在,因此它不会被获取。
我该如何传递值$BUILD_NUMBER
?
解决方案 1:
如果你使用
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
在将命令字符串发送到远程主机之前,你的 shell 将会进行插入操作。
解决方案 2:
单引号中的变量不会被评估。使用双引号:
ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"
shell 将扩展双引号中的变量,但不会扩展单引号中的变量。这将在传递给ssh
命令之前更改为所需的字符串。
解决方案 3:
(这个答案可能看起来不必要地复杂,但据我所知,它在空格和特殊字符方面很容易扩展和健壮。)
您可以直接通过命令的标准输入ssh
和read
来自远程位置的标准输入来提供数据。
在以下示例中,
索引数组中填充了(为了方便)您想要在远程端检索其值的变量的名称。
对于每一个变量,我们都给出
ssh
一个以空字符结尾的行,其中包含变量的名称和值。在命令本身中
shh
,我们循环这些行来初始化所需的变量。
# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi
ajlls é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 ' "$name" "${!name}"
done | ssh user@somehost.com '
while read -rd '"''"' name value
do
export "$name"="$value"
done
# Check
printf "FOO = [%q]; BAR = [%q]
" "$FOO" "$BAR"
'
输出:
FOO = [$'apjlljs ailsi
ajlls éjij']; BAR = [ygnàgyààynygbjrbjrb]
如果您不需要export
这些,您应该可以使用declare
而不是export
。
一个真正简化的版本(如果您不需要可扩展性,只有一个变量需要处理等)将如下所示:
$ ssh user@somehost.com 'read foo' <<< "$foo"
解决方案 4:
SSHD 上默认接受的环境变量列表包括LC_*
。因此:
LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3
解决方案 5:
也可以通过 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
解决方案 6:
如前所述,您不需要在远程主机上设置环境变量。相反,您只需在本地主机上执行元扩展,然后将值传递给远程主机即可。
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
在本地主机上进行元扩展远程环境变量将被
远程 shellBUILD_NUMBER
使用
解决方案 7:
如果需要从特定的 shell 运行它,你可以执行以下操作:
ssh pvt@192.168.1.133 "bin/bash -c -i '~/tools/myScript.pl $BUILD_NUMBER'"
解决方案 8:
转义变量以便访问 ssh 会话之外的变量:ssh pvt@192.168.1.133 "~/tools/myScript.pl \$BUILD_NUMBER"
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件