1. ホーム

[解決済み】SSHリモートコマンドを手動で実行すると、なぜ環境変数が少なくなるのか?[クローズド]

2022-04-06 17:59:43

質問

あるマシンに ssh して実行するとうまくいくコマンドがあるのですが、.NET のようなリモート ssh コマンドを使用して実行しようとすると失敗します。

ssh user@IP <command>

両方の方法で "env" の出力を比較すると、異なる環境での結果が得られます。手動でマシンにログインして env を実行すると、.NET を実行したときよりもはるかに多くの環境変数が得られます。

ssh user@IP "env"

なぜでしょうか?

解決方法は?

シェルには様々な種類があります。SSHコマンド実行シェルは非対話型シェルで、通常のシェルはログインシェルと対話型シェルがあります。以下、man bashより説明します。

       ログインシェルとは、引数の最初の文字が
       がゼロのもの、または --login オプションで起動したものです。

       対話型シェルとは、非オプションなしで起動するシェルです。
       引数および-cオプションなしで、標準入力
       とエラーがともにターミナルに接続されている(と判断される)。
       isatty(3) で起動されたもの、または -i オプションで起動されたものです。 PS1 は
       を設定し、$-はbashが対話型である場合にiを含む。
       シェルスクリプトや起動ファイルで、この状態をテストすることができます。

       次の段落では、bashがどのように実行されるかを説明します。
       スタートアップ・ファイル  もし、ファイルが存在するにもかかわらず
       を読み込むと、エラーを報告します。 チルダはファイルの中で展開されます。
       のチルダ展開で説明するように、名前にチルダを使用します。
       EXPANSIONセクションを参照してください。

       bashが対話型ログインシェルとして起動された場合、あるいは
       非対話型シェルで --login オプションを指定した場合、最初に
       etc/profileからコマンドを読み込んで実行します。
       が存在します。 そのファイルを読み込んだ後、次のファイルを探します。
       ~/.bash_profile、~/.bash_login、~/.profileの順です。
       の順番で、最初のものからコマンドを読み込んで実行します。
       が存在し、読み取り可能であること。 また,--noprofileオプションは
       シェル起動時に使用すると、この動作を抑制することができます。
       イオール。

       ログインシェルが終了するとき、bashは、コマンドの読み込みと実行を行います。
       が存在する場合は、~/.bash_logout ファイルから取得します。

       ログインシェルでない対話型シェルが存在する場合、そのシェルは
       を起動すると、~/.bashrc.のコマンドを読み込んで実行します。
       が存在する場合は、そのファイルを削除します。 この機能を無効にするには
       --norc オプションを指定します。  rcfile ファイルオプションを付けると、強制的に bash
       の代わりに、ファイルからコマンドを読み込んで実行します。
       ~/となります。

       bashが非対話的に起動されたとき、シェル
       スクリプトは、例えば、BASH_ENV 変数を検索します。
       環境にある場合は、その値が展開されます。
       拡張された値を読み込むファイル名として使用します。
       と実行します。  Bashは、次のようなコマンドを実行したように動作します。
       が実行されました。
              if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
       が、PATH変数の値は検索に使用されません。
       というファイル名が表示されます。