通过ssh传递环境变量以进行远程扩展

时间:2017-02-22 20:38:51

标签: shell ssh

我正在尝试将环境变量传递给我的shell脚本,然后回显我传入的内容。在此示例中,$ HOME是已设置的环境变量。

./my_script.ksh $HOME

#! /usr/bin/ksh
my_var=${1}
echo "You sent: ${my_var}"

我希望我的输出为You sent: $HOME,但它正在评估它并正在生成You Sent: /home/blah/usr

关键是我打算做一个SSH命令,我需要传递$ my_var太未评估(也就是$ HOME),因为每个服务器上的$ HOME是一个不同的值,对于我想要的SSH命令它使用来自服务器的值也是SSH的。所以希望只是传递它,所以在SSH期间它会正确评估

这是我想要发生的事情的一个例子。我们假设$ HOME已经在Server1和Server2上设置为:

Server1 $HOME: /home/blah/usr
Server2 $HOME: /home/superblah/newusr

从Server1执行my_script.ksh $HOME

该脚本与上面的相同,只有一行:

ssh my_user@Server2 "echo Server got: $my_var"

我目前的输出是什么:

You sent: /home/blah/usr
Server got: /home/blah/usr

我想要的只是生成的ssh命令:

Server got: /home/superblah/newusr

感谢。

2 个答案:

答案 0 :(得分:0)

您可以通过用单引号

包装来阻止解析变量
./my_script.ksh '$HOME'

我试过这样:

[host1]$ echo $HOME
/home/user1
[host1]$ ssh user2@host2 echo '$HOME'
/home/user2
[host1]$

答案 1 :(得分:0)

$url = '/optimize/index.php'; 可用于将envsubst$HOME形式的字符串替换为具有相同名称的环境变量的值。因此:

$foo

...将发出:

#!/usr/bin/env ksh
my_var=$1
my_var_subst=$(envsubst <<<"$my_var")
echo "You sent: ${my_var}"
echo "Interpreted as: ${my_var_subst}"
使用You sent: $HOME Interpreted as: /home/superblah/newusr 调用

请注意,在通过SSH传递值时需要小心,因为SSH使用传递的参数隐式运行./myscript '$HOME' - 将它们与空格连接在一起并将该单个字符串作为shell命令进行评估。因此,在ssh上运行命令可能如下所示:

sh -c "$*"

...或...

ssh somehost $'./myscript \'$HOME\''

...或者,为了让它更容易,让shell为你做逃避工作:

ssh somehost "./myscript \$HOME"