web-dev-qa-db-ja.com

ssh user @ IP sh <コマンド>が環境変数を見逃しました

私はアプローチを使用します

ssh user @ IP sh [runme.sh]

スクリプトをリモートで実行するには、これで問題なく動作します。しかし、runme.shに問題があり、〜/ .bashrcで定義されている環境変数を取得できません。スクリプトをローカルで起動すると、すべてうまくいきますが、sshコマンドを使用してこれらの環境構成を取得するにはどうすればよいですか?

実行可能なアプローチの1つは、1行を追加することです。

。 〜/ .bashrc

最初はすべてのrunme.shで、しかしこのようにして、クライアント上の多くの「runme.sh」ファイルを変更する必要があります。より良いアイデアはありますか?

5
Weiwei Yang

~/.bashrcに環境変数の定義を含めるべきではありません。そのファイルは、インタラクティブに実行する場合のbashの構成用です(エイリアス、プロンプト、そのようなもの)。環境変数の場所は~/.profileです。テキストモードでインタラクティブセッションを開始すると読み取られ、多くのシステムではグラフィックモードでも読み取られます。詳細については、 この回答 を参照してください。

リモートマシンの通常の環境変数を設定するbashシェルを実行するには、次のようにします。

ssh user@IP bash --login runme.sh

他のシェルの場合は、.profile(およびおそらく/etc/profileも)を読み取らせます。

ssh user@IP '. /etc/profile; . ~/.profile; exec runme.sh'

ローカルセッションからsshを介して環境変数をコピーする場合、それは可能ですが、通常はサーバー側で無効になっています。詳細については、 この回答 をお読みください。

これはどう:

ssh user@IP -- '. ~/.bashrc; sh runme.sh'

shbashの違いについては少し注意する必要があります。 .bashrcに凝ったカスタマイズがあり、shがダッシュのようなものである場合、これは失敗する可能性があります。

1

sshコマンドで/etc/profileを調達するのはどうですか?

ssh user@Host "source /etc/profile; sh runme.sh"

この質問 の回答から採用

0
Ngoc Pham
# If not running interactively, don't do anything
[ -z "$PS1" ] && return

通常は~/.bashrcは、前のコードの何らかの形式で始まります。 sshを使用してコマンドを直接実行する場合、bashはインタラクティブに実行されないため、設定する環境変数がそのような行の前にあることを確認する必要があります。

0
Arrowmaster

ターゲットシステムでは、shは実際にはbashですか? .bashrcが自動的に読み取られない理由の1つとして、そうではない可能性があります。

bash runme.shの実行は機能しますか?もしそうなら、それはあなたの問題です。

また、誰かがすでに指摘したように、シェルが.bashrcでインタラクティブに実行されているかどうかを検出するものがある場合は、変数をこのコードの上に設定する必要があります。

0
Richard Rebel