2017-02-22 12 views
0

シェルスクリプトに環境変数を渡して、渡したものをエコーアウトしようとしています。この例では、$ 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コマンドを行う上で計画していることです各サーバーの$ HOMEは異なる値であり、SSHコマンドではサーバーからの値を使用したいので、$ my_varも評価されていません($ HOMEとも言います)。 SSHの間に正しく評価されるようにするだけです。

ここに私が何をしたいのかの例があります。のは、$ HOMEはすでに同じようServer1とServer2の上で設定されていると仮定しましょう:my_script.ksh $HOME

スクリプト実行のServer1から

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

ことの1本の余分のラインと、上記と同じである:

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

明確にするために、[あなたの**リアル**質問](http://stackoverflow.com/questions/42400222/use:または、それが簡単に、シェルはあなたのためのエスケープ仕事をさせ作ります-remote-environment-variables-value-in-scp-path)は、SSHの代わりにSCPを使用することと非常に関連しています。 –

+0

また、 '$ HOME'を使うことはやや誤解を招きます.SHCP接続やSSH接続が$ HOMEになったときに、デフォルトのリモートディレクトリに依存する回答に役立ちます。 –

+0

ところで、私はksh93用のコードを書いています。もしあなたが 'foo = $(printf '%q' ...)'を 'printf -v foo '%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は、暗黙のうちに渡された引数とsh -c "$*"を実行するように、1つは、SSHを介して値を渡すときに注意する必要があることを注意 - 空白と一緒にそれらを連結し、シェルコマンドとしてその単一の文字列を評価します。このように、SSHを介してコマンドを実行すると、次のようになります。

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

...か...

ssh somehost "./myscript \$HOME" 

...

remote_command=$(printf '%q ' ./myscript '$HOME') 
ssh somehost "$remote_command" 
関連する問題