2010-07-13 16:59:57 +0000 2010-07-13 16:59:57 +0000
95
95

sshするときに、セッションからセッションに変わる環境変数をサーバに設定するにはどうすればいいのでしょうか?

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

回答 (8)

116
116
116
2010-07-13 19:25:13 +0000

もちろん、コマンド内で環境変数を設定することもできますが、引用符には注意しなければなりません。

サーバ上の変数がクライアント上の変数と同じ値を取得したい場合は、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; unset LC\_MYVAR; export MYVAR; mycommand'

LC_* がオプションではない場合は、環境変数 TERM に情報を渡すことができ、常にコピーされます(ただし、長さに制限がある場合があります)。リモートシェルが TERM 変数を制限して既知の端末タイプを指定しないようにする必要があります。リモートの対話型シェルを起動していない場合は、-t オプションを ssh に渡してください。

env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:\*}; TERM=${TERM##\*:}; export MYVAR; mycommand'

もう一つの可能性は、コマンドで直接変数を定義することです。

ssh -t server.example.com 'export MYVAR="extra information"; mycommand'

このように、ローカル変数を渡すと、次のようになります。

ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'

ただし、引用符の問題には注意してください: 変数の値はリモート側で実行されるシェルスニペットに直接補間されます。上の最後の例では、$LOCALVAR にシングルクォート (') が含まれていないと仮定しています。

12
12
12
2012-02-03 17:09:54 +0000

ターゲットホストを管理できる場合、ローカル環境変数をターゲットホストに渡すことができるように sshd を構成することができます。

sshd のマニュアルページから。

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 にあります。

6
6
6
2010-07-13 17:52:27 +0000

クライアント上に環境変数があり、それをリモートコマンドで利用できるようにしたいということでしょうか? ssh が魔法のようにそれを渡す方法はないと思いますが、おそらく次のようなことができるでしょう。例えば、以下のように使うのではなく

ssh remote.host my_command

とする代わりに、次のようにすることができます。

ssh remote.host env ENV_VAR=$ENV_VAR my_command

0x1&

4
4
4
2019-06-12 10:45:04 +0000

ローカルクライアントでは、~/.ssh/config

Host myhost
  SetEnv FOO=bar

のように SetEnv を追加することができます。

サーバー上では、man ssh_config の設定ファイルでクライアントが特定の環境変数を渡すことを許可していることを確認してください。

AcceptEnv LANG LC_* FOO BAR*

注意: /etc/ssh/sshd_config.

3
3
3
2018-05-14 14:36:55 +0000

@emptysetさんの回答(これは私には効きませんでしたが)から、私はこの回答にたどり着きました。

このコマンドを~/.ssh/authorized_keysファイルに追加してください。

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

export VARIABLE=<something> はすぐに終了してしまい、SSH 接続が閉じられてしまいました(サーバからロックアウトされてしまいました)が、/usr/bin/env ... $SHELL は環境を変更してデフォルトのシェルを実行します。

1
1
1
2010-07-13 17:15:31 +0000

パスワードなしの ssh ログインが設定されていると仮定して、カスタムコマンドを実行してみてください。サーバ上で、クライアントからの鍵に対応する ~/.ssh/authorized_keys エントリを以下のように編集します:

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

もう少し詳しくは Forced Command のセクションの このリンク をご覧ください。

1
1
1
2015-08-28 16:55:01 +0000

私はホームディレクトリと /etc に cramfs があるデバイス用に OpenSSH のカスタムビルドを作っていました (Cram FS は読み取り専用です) ので、~/.ssh/environment は FS 全体を再構築しないと動作しませんでした。sshdconfig で authroizedkeys ファイルの場所を指定することができますが、なぜか ~/.ssh/authroizedkeys の中の環境変数に対してのみ、environment= が動作してしまいます。etc/profile を編集することはオプションではなく、標準ではないディレクトリで ssh をロードしなければなりませんでした。session.c で childset_env(…. “MAIL”….) の後に、必要な環境変数を追加してください(これはハックですが…)。TGI-FLOSS

0
0
0
2019-04-11 17:12:11 +0000
ssh -t your_host_or_ip 'export some_var_name=whatever_you_want; bash'
```というシンプルなコマンドを一つだけ

関連する質問

19
12
7
8
16