私はアプローチを使用します
ssh user @ IP sh [runme.sh]
スクリプトをリモートで実行するには、これで問題なく動作します。しかし、runme.shに問題があり、〜/ .bashrcで定義されている環境変数を取得できません。スクリプトをローカルで起動すると、すべてうまくいきますが、sshコマンドを使用してこれらの環境構成を取得するにはどうすればよいですか?
実行可能なアプローチの1つは、1行を追加することです。
。 〜/ .bashrc
最初はすべてのrunme.shで、しかしこのようにして、クライアント上の多くの「runme.sh」ファイルを変更する必要があります。より良いアイデアはありますか?
~/.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'
sh
とbash
の違いについては少し注意する必要があります。 .bashrc
に凝ったカスタマイズがあり、sh
がダッシュのようなものである場合、これは失敗する可能性があります。
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
通常は~/.bashrc
は、前のコードの何らかの形式で始まります。 sshを使用してコマンドを直接実行する場合、bashはインタラクティブに実行されないため、設定する環境変数がそのような行の前にあることを確認する必要があります。
ターゲットシステムでは、sh
は実際にはbash
ですか? .bashrc
が自動的に読み取られない理由の1つとして、そうではない可能性があります。
bash runme.sh
の実行は機能しますか?もしそうなら、それはあなたの問題です。
また、誰かがすでに指摘したように、シェルが.bashrc
でインタラクティブに実行されているかどうかを検出するものがある場合は、変数をこのコードの上に設定する必要があります。