sudo コマンドを実行して、現在ログオンしているユーザーの環境変数を読み込むにはどうすればいいですか?

sudo コマンドを実行して、現在ログオンしているユーザーの環境変数を読み込むにはどうすればいいですか?

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次のようになります。~/.profileSSH使用時にロードされない。それなら入れてもおかしくないですね~/.bashrc

あるいは、それらを別のファイル (例: ) に配置し~/.special_env、そのファイルを~/.bashrcまたは~/.profileなどから取得することもできます。利点は、癖やひねりに関係なく、必要に応じてファイルを取得できることです。

ssh -i keyfile [email protected]  '. ~/.special_env; sh -v /opt/dir/script'

関連情報