在远程ssh命令中传递变量

时间:2010-07-23 01:03:06

标签: linux bash shell ssh

我希望能够使用ssh从我的机器运行命令并传递环境变量$BUILD_NUMBER

以下是我正在尝试的内容:

ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
在进行ssh调用的机器上设置了

$BUILD_NUMBER,因为远程主机上不存在该变量,所以它不会被拾取。

如何传递$BUILD_NUMBER的价值?

7 个答案:

答案 0 :(得分:149)

如果您使用

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

答案 1 :(得分:26)

不评估单引号中的变量。使用双引号:

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

shell将使用双引号扩展变量,但不能用单引号扩展。在传递给ssh命令之前,这将更改为您想要的字符串。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

(此答案似乎不必要,但据我所知,它在空格和特殊字符方面易于扩展和增强。)

您可以直接通过ssh命令的标准输入和read从远程位置输入数据。

在以下示例中,

  1. 为方便起见,为索引索引数组填充了要在远程获取其值的变量的名称。
  2. 对于每个变量,我们在ssh中以空终止的行给出变量的名称和值。
  3. 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"

答案 4 :(得分:0)

如前所述,您无需在远程主机上设置环境变量。相反,您可以在本地主机上执行元扩展,并将值传递给远程主机。

printf("%0*d\n",l,i);

如果您真的想在远程主机上设置环境变量并使用它,可以使用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环境变量将由
    使用 远程shell

答案 5 :(得分:0)

还可以通过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 :(得分:-1)

转义变量以访问ssh会话之外的变量:     ssh pvt@192.168.1.133"〜/ tools / myScript.pl \ $ BUILD_NUMBER&#34;