2016-05-27 5 views
0

SSH経由で接続し、接続時にコマンドを実行します。 は、私は次のコマンドを実行します。「コマンド」接続時にSshとrunコマンドを実行します。

-t

SSHホストをしかし、私は、コマンドを実行するためには、いくつかの環境変数を変更する必要があるとが動作していないevalのように思えます。

ssh host -t "eval `somescript.sh tcsh`; env | grep variables_that_should be_changed" 

それは単にスクリプトを評価およびコマンドが「somescript.shを」存在しないことを言っていません。

somescript.shはリモートマシン上に存在しますが、リモートマシン上に存在しません。

これを解決する方法はありますか?

+0

"私はいくつかのenv variabesを変更する必要があります"とはどういう意味ですか?これらの変数は、あなたがSSHing *している場所の条件に基づいて変更する必要がありますか?私。 'ssh -t remotehost" somescript.sh opt1 opt2 opt3 "'のようにスクリプトにオプションを提供する必要が本当にありますか? – ghoti

答えて

2

環境変数を設定して同じスクリプトでコマンドを実行し、そのスクリプトをsshで実行します。環境変数は、スクリプトが存在するまで有効です。

+0

働いて、ありがとう! –

0

あなたはすでに「ベストアンサー」を選択していますので、私の答えは何が間違っているのかを理解するのに役立ちます。

質問のコードに基づいて、引用問題が発生しているようです。あなたが言った:

ssh host -t "eval `somescript.sh tcsh`; env | grep variables_that_should be_changed" 

あなたは二重引用符内のバッククォート(`...`)を持っているとき、彼らは呼び出すシェルではなく、リモートサーバー上で実行しているシェルによって展開されます。したがって、コマンドラインではsomescript.shがローカルに存在する必要があり、コマンドラインを使用して、そのスクリプトの出力をリモートで実行しているコマンドラインに埋め込むことができます。おそらくあなたが望むものではないでしょう。

二重引用符を一重引用符で置き換えると、構文や手順の改良にもかかわらず、バッククォートは、ローカルで展開するのではなく、リモートで実行しているコマンドラインの一部として送信されます。

また、バッククックを使用する場合は、代わりに$(...)表記に置き換えることを検討してください。読みやすく、ネストすることができ、現代のシェルでは一般的に「より良い方法」と考えられています。

+0

説明をくれてありがとう、それは私を大いに助けた –

関連する問題