サーバーにssh
するとき、クライアントからサーバーに環境変数を渡すにはどうすればよいですか?この環境変数は、sshを呼び出すたびに変わるので、sshを呼び出すたびに$HOME/.ssh2/environment
を上書きしたくはありません。これどうやってするの?
もちろん、コマンド内で環境変数を設定することもできますが、引用には注意を払う必要があります。シェルがローカルのコマンドラインを解析すると、リモートシェルは文字列itを実行します。受け取ります。
クライアント上と同じ値をサーバー上で取得する場合は、SendEnv
オプションを試してください。
ssh -o SendEnv = MYVAR server.example.com mycommand
ただし、これにはサーバーからのサポートが必要です。 OpenSSHでは、変数名は/etc/sshd_config
で承認されなければなりません。
サーバーが特定の特定の変数名しか許可しない場合は、それを回避することができます。たとえば、一般的な設定ではLC_*
の通過が許可され、次の操作を実行できます。
ssh -o SendEnv = LC_MYVAR server.example.com 'MYVAR = $ LC_MYVAR; LC_MYVARを設定解除します。 MYVARをエクスポートします。 mycommand '
LC_*
でさえもオプションではない場合、常にコピーされるTERM
環境変数で情報を渡すことができます(ただし長さの制限があるかもしれません)。リモートシェルが既知の端末タイプを指定するためにTERM
変数を制限しないようにする必要があります。リモートの対話型シェルを起動していない場合は、-t
オプションをsshに渡してください。
env TERM = "追加情報:$ TERM" ssh -t server.example.com 'MYVAR = $ {TERM%:*}; TERM = $ {TERM ## *:}; MYVARをエクスポートします。 mycommand '
もう1つの可能性は、コマンド内で変数を直接定義することです。
ssh -t server.example.com 'export MYVAR = "追加情報"; mycommand '
したがって、ローカル変数を渡すと、
ssh -t server.example.com 'export MYVAR =' "'$ LOCALVAR'" '; mycommand '
ただし、引用の問題には注意してください。変数の値は、リモート側で実行されるシェルスニペットに直接内挿されます。上記の最後の例では、$LOCALVAR
に一重引用符('
)が含まれていないと仮定しています。
ターゲットホストを管理できる場合は、ローカル環境変数をターゲットホストに渡すことを許可するようにsshdを設定できます。
Sshd_configのマニュアルページから:
PermitUserEnvironment
Specifies whether ~/.ssh/environment and environment= options in
~/.ssh/authorized_keys are processed by sshd. The default is
"no". Enabling environment processing may enable users to bypass
access restrictions in some configurations using mechanisms such
as LD_PRELOAD.
sshdの設定は通常/etc/ssh/sshd_config
にあります
それで、あなたのクライアントでは、あなたは何らかの環境変数を持っています、そしてあなたはそれをリモートコマンドで利用可能にしたいですか? sshに魔法のように渡す方法はないと思いますが、おそらくこのようなことができます。使う代わりに、
ssh remote.Host my_command
あなたはこれを行うことができます:
ssh remote.Host env ENV_VAR=$ENV_VAR my_command
@ emptysetの返事(これは私にはうまくいきませんでした)は私にこの答えを導きました:
このコマンドを~/.ssh/authorized_keys
ファイルに追加することができます。
command="/usr/bin/env VARIABLE=<something> $Shell" ssh-rsa <key>
export VARIABLE=<something>
はすぐに終了し、SSH接続は閉じられました(私をサーバーから締め出す)のに対して、/usr/bin/env ... $Shell
はあなたのデフォルトシェルを変更された環境で実行します。
パスワードなしのsshログイン設定があると仮定して、カスタムコマンドを起動してみることもできます。サーバー上で、クライアントからのキーに対応する〜/ .ssh/authorized_keysエントリを編集します。
command="export VARIABLE=<something>" ssh-rsa <key>
もう少し詳しくは、強制コマンドのセクションで このリンク を見てください。
ホームディレクトリにcramfsを、/ etc(Cram FSは読み取り専用)を持つデバイス用にOpenSSHのカスタムビルドを作成していたので、〜/ .ssh /環境は全体を再構築しなければ動作しません。 FSそしてこれらは現場で導入された機器でした(Embedded SystemsそれゆえCRAMFSの使用)。 sshd_configでauthroized_keysファイルの場所を指定できますが、何らかの理由でenvironment =が〜/ .ssh/authroized_keysの環境変数に対してのみ機能します。/etc/profileを編集することは選択肢ではなく、私はsshを非標準のディレクトリにロードしなければなりませんでした。 session.cでchild_set_env(... "MAIL" ...)の後に必要な環境変数を追加するだけです(これは私が知っているハックです...)が、セッションのためにハードコードされた環境変数が必要な場合ソースからコンパイルすると、これができます。 TGI-FLOSS
ローカルクライアントの~/.ssh/config
にSetEnv
を追加することができます。
Host myhost
SetEnv FOO=bar
注:man ssh_config
を確認してください。
それから、サーバー上で、クライアントがあなたの/etc/ssh/sshd_config
設定ファイルにある特定の環境変数を渡すことを許可するようにしてください:
AcceptEnv LANG LC_* FOO BAR*
注:man sshd_config
を確認してください。
1つだけの簡単なコマンド:
ssh -t your_Host_or_ip 'export some_var_name=whatever_you_want; bash'