shell 在远程ssh命令中传递变量

dpiehjr4  于 2022-12-30  发布在  Shell
关注(0)|答案(8)|浏览(696)

我希望能够使用ssh从我的计算机运行命令,并传递环境变量$BUILD_NUMBER
我是这么做的:

ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'

$BUILD_NUMBER是在执行ssh调用的机器上设置的,由于远程主机上不存在该变量,因此不会获取它。
如何传递$BUILD_NUMBER的值?

dfty9e19

dfty9e191#

如果您使用

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

代替

ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'

shell将在向远程主机发送命令字符串之前插入$BUILD_NUMBER

dgenwo3n

dgenwo3n2#

不计算单引号中的变量。请使用双引号:

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

shell会用双引号展开变量,但不会用单引号。在传递给ssh命令之前,这将变成您想要的字符串。

11dmarpk

11dmarpk3#

  • (这个答案可能看起来不必要地复杂,但据我所知,它很容易扩展,并且在空格和特殊字符方面很健壮。)*

您可以直接通过ssh命令的标准输入和来自远程位置的read命令输入数据。
在下面的示例中,
1.一个索引数组(为了方便)被填充了你想要在远程端检索其值的变量的名称。
1.对于其中的每个变量,我们给ssh一个以空值结尾的行,给出变量的名称和值。
1.在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"
oug3syen

oug3syen4#

默认情况下,SSHD上接受的环境变量列表包括LC_*

LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3
daupos2t

daupos2t5#

通过ssh显式传递环境变量也是可能的,它确实需要一些服务器端的设置,所以这不是一个通用的答案。
在我的例子中,我希望将备份存储库加密密钥传递给备份存储服务器上的命令,而不将该密钥存储在那里,但请注意,任何环境变量在ps中都可见!在stdin上传递密钥的解决方案也可以工作,但我发现它太麻烦了。在任何情况下,下面是如何通过ssh传递环境变量:
在服务器上,编辑sshd_config文件(通常为/etc/ssh/sshd_config),并添加与要传递的变量相匹配的AcceptEnv指令。请参见man sshd_config。在我的示例中,我希望将变量传递给博格backup,因此我选择了:

AcceptEnv BORG_*

现在,在客户机上使用-o SendEnv选项发送环境变量。以下命令行设置环境变量BORG_SECRET,然后将其标记为发送到客户机(称为backup)。然后在那里运行printenv并过滤博格变量的输出:

$ BORG_SECRET=magic-happens ssh -o SendEnv=BORG_SECRET backup printenv | egrep BORG
BORG_SECRET=magic-happens
yb3bgrhw

yb3bgrhw6#

转义变量以便访问ssh会话外部的变量:ssh pvt@192.168.1.133“~/工具/myScript.pl$构建版本编号”

j2cgzkjk

j2cgzkjk7#

正如前面所回答的,您不需要在远程主机上设置环境变量,而只需在本地主机上执行元扩展,并将值传递给远程主机即可。

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在本地主机上执行 meta扩展
  • 远程BUILD_NUMBER环境变量将由使用

遥控器 shell

ie3xauqp

ie3xauqp8#

如果您需要从特定的shell运行它,可以执行以下操作:

ssh pvt@192.168.1.133 "bin/bash -c -i '~/tools/myScript.pl $BUILD_NUMBER'"

相关问题