
ssh sudo コマンドを実行する必要があります。
コマンドは次のとおりです。
ssh -i keyfile [email protected] 'sh -v /opt/dir/script'
スクリプトには次の内容が含まれています。
sudo -E node some.js
-E引数を使用する理由は、コマンドがuserAによって実行されるためです。そして開始されるプロセスは定義をロードする必要がある
/user/userA/.bashrc
上記のコマンドは、
/user/userA/.bashrc
実際には、-E が何もしていないかのように実行されます。つまり、すべての変数が未定義として表示されます。
リモートマシンにuserAとして対話的にログインし、同じコマンドを実行すると、
sudo -E node some.js
変数は正しく読み込まれ、期待どおりの動作が見られます。
何を変えればよいか分かる人はいますか?
答え1
シェルが source することを期待しているので~/.bashrc
、シェルは Bash であると想定します。
ひねりその1: SSHサーバーはシェルコードを非対話型シェルに渡します。非対話型Bashではない読む~/.bashrc
。
ひねりその2: bashは、SSHサーバーによって実行される場合のように、標準入力がネットワーク接続に接続された状態で実行されているかどうかを判断しようとします。bashがこの方法で実行されていると判断した場合、するからコマンドを読み取って実行します~/.bashrc
。
ひねり3: 多くのディストリビューション(Ubuntuを含む)では、デフォルト(スケルトン)は~/.bashrc
シェルが非対話型の場合に返されるコードから始まります。実際には、ファイルの残りの部分は出典なし。
あなたの場合、関連する環境変数はこのコードの後に定義されていると思います。コードは次のようになります。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
簡単な解決策は、割り当てを移動することです。前にecho
このコード。もっと多くのことを行うコマンド(例えば、何かを実行する)を移動したい場合は、リモートファイル転送が壊れる可能性があるため、十分に注意してください。bashrc
現在のシェルが対話型であるかどうかを確認するのはなぜですか?変数だけに関するものであれば、安全なはずです。
一般的に環境定義されるべきである~/.profile
ではなく です~/.bashrc
が、割り当てを に移動すると、~/.profile
次のようになります。~/.profile
SSH使用時にロードされない。それなら入れてもおかしくないですね~/.bashrc
。
あるいは、それらを別のファイル (例: ) に配置し~/.special_env
、そのファイルを~/.bashrc
または~/.profile
などから取得することもできます。利点は、癖やひねりに関係なく、必要に応じてファイルを取得できることです。
ssh -i keyfile [email protected] '. ~/.special_env; sh -v /opt/dir/script'