2つのホストAとBがあり、ユーザーaとbがあるとします。 Bは、CygwinがインストールされているWindowsマシンです(問題がある場合)。
Bは、パスワードなしでAからSSHを介してAにアクセスするように構成されている(Aの公開RCAキーが含まれている)ので、次の方法でAからコマンドを実行できます。
ssh b@B [command]
しかし、環境変数にアクセスする必要があるコマンドを実行しようとすると、コマンドは失敗します。
[15:54:08] - a@A - ~
$ ssh b@B 'echo $ANT_HOME'
空の文字列を返します。
(SSH経由ではなく)直接接続されている場合、同じコマンドが正しく実行されます。
b@B ~
$ echo $ANT_HOME
/cygdrive/c/PROGRA~1/Apache-ant-1.9.0
後者は、関連する変数が「bash_profile」でエクスポートされたために可能です。
export Java_HOME="/cygdrive/c/PROGRA~1/Java/jdk1.7.0_45"
export ANT_HOME="/cygdrive/c/PROGRA~1/Apache-ant-1.9.0"
しかし、何らかの理由で、これはSSHのケースには適用されません。
役に立つかもしれないいくつかの追加情報。
ホストBにはWindowsがありますXP +Cygwin。CYGWINsshdはSYSTEMアカウントで実行されます。Java_HOMEおよびANT_HOMEはWindowsの「システム」環境変数部分で定義されます。
「$ ssh b @ B env」コマンドを実行すると、ANT_HOMEまたはJava_HOMEが出力されませんが、sshd_configファイルに含めた場合は出力されます。しかし、それでも単純なコマンドssh b @ B 'echo $ ANT_HOME'は期待どおりに機能しません。
SSH経由でコマンドを実行するために何をする必要があるかについてのヒントを教えてください。
私のサーバーのマニュアルページから:
プロパティPermitUserEnvironmentを/etc/ssh/sshd_config
として有効にし、環境変数を〜/ .ssh/environmentに設定して、環境変数を宣言し、リモートサーバーの場所PermitUserEnvironment yes
で許可する必要があります。
Sshの引数としてコマンドを実行すると、コマンドはsshdによって直接実行されます。シェルは関与していません。
これは、次のようなものを使用して確認できます。
ssh b @ B pstree
.bash_profileを取り込むのはシェル(この場合はbash)であり、シェルがログインシェルとして呼び出された場合、または--loginオプションで呼び出された場合にのみ行われます(bashのマニュアルページを参照) ; INVOCATIONを探します)。コマンドを直接実行するときに取得する環境は、ログイン時にsshdやPAMなどによって設定されます。
したがって、.bash_profileが必要な場合は、シェルの下で実行する必要があり、次のようにシェルをインタラクティブシェルまたはログインシェルとして実行する必要があります。
ssh b @ B "bash -l -c 'env'"
これにより、必要な出力が得られます。注意しなければならない唯一のことは、引用がかなり素早くトリッキーになることです。 Linuxでは少なくとも、
ssh b @ B bash -l -c 'env'
ログインシェルを取得しません(理由はわかりません)。