2017-02-22 89 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"