sshするときに、セッションからセッションに変わる環境変数をサーバに設定するにはどうすればいいのでしょうか?
ssh
をサーバに渡すとき、クライアントからサーバに環境変数を渡すにはどうすればいいですか?この環境変数は ssh の異なる呼び出しの間に変化するので、ssh を呼び出すたびに $HOME/.ssh2/environment
を上書きしたくありません。どうすればいいのでしょうか?
ssh
をサーバに渡すとき、クライアントからサーバに環境変数を渡すにはどうすればいいですか?この環境変数は ssh の異なる呼び出しの間に変化するので、ssh を呼び出すたびに $HOME/.ssh2/environment
を上書きしたくありません。どうすればいいのでしょうか?
もちろん、コマンド内で環境変数を設定することもできますが、引用符には注意しなければなりません。
サーバ上の変数がクライアント上の変数と同じ値を取得したい場合は、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
にシングルクォート ('
) が含まれていないと仮定しています。
ターゲットホストを管理できる場合、ローカル環境変数をターゲットホストに渡すことができるように 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
にあります。
@emptysetさんの回答(これは私には効きませんでしたが)から、私はこの回答にたどり着きました。
このコマンドを~/.ssh/authorized_keys
ファイルに追加してください。
command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>
export VARIABLE=<something>
はすぐに終了してしまい、SSH 接続が閉じられてしまいました(サーバからロックアウトされてしまいました)が、/usr/bin/env ... $SHELL
は環境を変更してデフォルトのシェルを実行します。
私はホームディレクトリと /etc に cramfs があるデバイス用に OpenSSH のカスタムビルドを作っていました (Cram FS は読み取り専用です) ので、~/.ssh/environment は FS 全体を再構築しないと動作しませんでした。sshdconfig で authroizedkeys ファイルの場所を指定することができますが、なぜか ~/.ssh/authroizedkeys の中の環境変数に対してのみ、environment= が動作してしまいます。etc/profile を編集することはオプションではなく、標準ではないディレクトリで ssh をロードしなければなりませんでした。session.c で childset_env(…. “MAIL”….) の後に、必要な環境変数を追加してください(これはハックですが…)。TGI-FLOSS