2017-02-22 65 views
0

我想将环境变量传递给我的shell脚本,然后回显出我传入的内容。在本例中,$ HOME是已设置的环境变量。通过ssh传递环境变量以进行远程扩展

./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 [email protected] "echo Server got: $my_var" 

什么我输出目前是:

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

我想要的只是ssh com要生产:

Server got: /home/superblah/newusr 

谢谢。

+0

要清楚,[your ** real ** question](http://stackoverflow.com/questions/42400222/use涉及SCP而不是SSH的-remote-environment-variables-value-in-scp-path)是非常相关的区别。 –

+0

另外,使用'$ HOME'有点令人误解 - 当SCP或SSH连接成为$ HOME时,它会依赖于默认远程目录的答案,而您的真实用例需要更多的参与。 –

+0

顺便说一句,我在这里写代码ksh93 - 如果你切换到bash,你想用'printf -v foo'%q'替换'foo = $(printf'%q'...)'' ......“,但其他情况不会改变。另一方面,如果你使用ksh的第三方克隆而不是真实的东西,我的第一个建议是切换 - 真正的ksh(如果你想要快速,有效和稳定的东西)或bash(用于不是那么快,而是积极维护的 - 而且在目前的4.x版中,即使语法不同,也会对功能非常感兴趣。 –

回答

0

您可以防止通过解析变量把它包在单引号

./my_script.ksh '$HOME' 

我想它是这样的:

[host1]$ echo $HOME 
/home/user1 
[host1]$ ssh [email protected] echo '$HOME' 
/home/user2 
[host1]$ 
+0

OP已经编辑了他们的问题,要求远程评估,而不仅仅是文字传输。 (我相信他们的*真正*问题是http://stackoverflow.com/questions/42400222/use-remote-environment-variables-value-in-scp-path,他们也稍微问了一下)。 –

+0

...当然,安全地进行远程评估* - 没有与“eval”相关的安全风险 - 意味着要做一些工作。 –

0

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 

./myscript '$HOME'调用。


需要注意的是一个需要经过值时通过SSH,如SSH隐含运行sh -c "$*"与传递的参数要小心 - 用空格串联在一起,他们和评价单一字符串作为shell命令。因此,通过ssh运行您的命令可能是这样的:

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

......或者......

ssh somehost "./myscript \$HOME" 

...或者,为了使它更容易,让外壳做你逃避的工作:

remote_command=$(printf '%q ' ./myscript '$HOME') 
ssh somehost "$remote_command"