web-dev-qa-db-ja.com

SSHを使うとき、セッションごとに変わるサーバー上の環境変数をどのように設定できますか?

サーバーにsshするとき、クライアントからサーバーに環境変数を渡すにはどうすればよいですか?この環境変数は、sshを呼び出すたびに変わるので、sshを呼び出すたびに$HOME/.ssh2/environmentを上書きしたくはありません。これどうやってするの?

86
Ross Rogers

もちろん、コマンド内で環境変数を設定することもできますが、引用には注意を払う必要があります。シェルがローカルのコマンドラインを解析すると、リモートシェルは文字列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に一重引用符(')が含まれていないと仮定しています。

106
Gilles

ターゲットホストを管理できる場合は、ローカル環境変数をターゲットホストに渡すことを許可するように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にあります

12
Duncan Beevers

それで、あなたのクライアントでは、あなたは何らかの環境変数を持っています、そしてあなたはそれをリモートコマンドで利用可能にしたいですか? sshに魔法のように渡す方法はないと思いますが、おそらくこのようなことができます。使う代わりに、

ssh remote.Host my_command

あなたはこれを行うことができます:

ssh remote.Host env ENV_VAR=$ENV_VAR my_command
6
pioto

@ emptysetの返事(これは私にはうまくいきませんでした)は私にこの答えを導きました:

このコマンドを~/.ssh/authorized_keysファイルに追加することができます。

command="/usr/bin/env VARIABLE=<something> $Shell" ssh-rsa <key>

export VARIABLE=<something>はすぐに終了し、SSH接続は閉じられました(私をサーバーから締め出す)のに対して、/usr/bin/env ... $Shellはあなたのデフォルトシェルを変更された環境で実行します。

3
madprog

パスワードなしのsshログイン設定があると仮定して、カスタムコマンドを起動してみることもできます。サーバー上で、クライアントからのキーに対応する〜/ .ssh/authorized_keysエントリを編集します。

command="export VARIABLE=<something>" ssh-rsa <key>

もう少し詳しくは、強制コマンドのセクションで このリンク を見てください。

1
emptyset

ホームディレクトリに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

1
Will

ローカルクライアントの~/.ssh/configSetEnvを追加することができます。

Host myhost
  SetEnv FOO=bar

注:man ssh_configを確認してください。

それから、サーバー上で、クライアントがあなたの/etc/ssh/sshd_config設定ファイルにある特定の環境変数を渡すことを許可するようにしてください:

AcceptEnv LANG LC_* FOO BAR*

注:man sshd_configを確認してください。

0
kenorb

1つだけの簡単なコマンド:

ssh -t your_Host_or_ip 'export some_var_name=whatever_you_want; bash'
0
grepit