ssh
サーバーにアクセスするときに、クライアントからサーバーに環境変数を渡すにはどうすればよいですか?この環境変数はsshの異なる呼び出し間で変化するため$HOME/.ssh2/environment
、ssh呼び出しを行うたびに上書きしたくありません。これどうやってするの?
ssh
manページからは、〜/ .ssh2 / environmentを変更しない限り、サーバーにログインしてから変数を手動で設定する以外、その方法はありません。
ssh
サーバーにアクセスするときに、クライアントからサーバーに環境変数を渡すにはどうすればよいですか?この環境変数はsshの異なる呼び出し間で変化するため$HOME/.ssh2/environment
、ssh呼び出しを行うたびに上書きしたくありません。これどうやってするの?
ssh
manページからは、〜/ .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 '
別の可能性は、コマンドで変数を直接定義することです:
ssh -t server.example.com 'export MYVAR = "追加情報"; mycommand '
したがって、ローカル変数を渡す場合:
ssh -t server.example.com 'export MYVAR =' "'$ LOCALVAR'" '; mycommand '
ただし、引用の問題に注意してください。変数の値は、リモート側で実行されるシェルスニペットに直接補間されます。上記の最後の例で$LOCALVAR
は、単一引用符('
)が含まれていないことを想定しています。
AcceptEnv
ディレクティブを入力sshd_config
します。しかしTERM
、サーバー側でフィルター処理する方法がない限り、特別に扱われます(構成設定に関係なく、シェルの環境で設定されます)。それを上書きするプロファイルスクリプト(/etc/profile
or ~/.profile
またはor など~/.bashrc
)がないことを確認しますか?
TERM
クライアントがサーバーにttyの割り当てを要求した場合にのみ送信されます。リモート側に端末がない場合、送信することは役に立たないでしょうTERM
。このコマンドを指定する場合は、リモート側の端子を持つようにしたい場合は、あなたが必要とする-t
コマンドラインオプション(またはRequestTTY
中を~/.ssh/config
)。
ターゲットホストを管理できる場合は、ローカル環境変数をターゲットホストに渡すことができるように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
、変更された環境でデフォルトのシェルを実行します。
$SHELL
実際のシェルに置き換えようとしましたか?また、サーバーに/ usr / bin / envが存在することも確認してください。しかし、解決策は完璧ではありませんscp
。使用したいときやインラインコマンドを実行したときにハングすることに気付きました。
PermitUserEnvironment yes
と使用してenvironment="..."
の代わりにcommand="..."
。
パスワードなしのsshログイン設定があると仮定して、カスタムコマンドの呼び出しを試みることができます。サーバーで、クライアントからのキーに対応する〜/ .ssh / authorized_keysエントリを編集します。
command="export VARIABLE=<something>" ssh-rsa <key>
詳細については、「強制コマンド」セクションのこのリンクを参照してください。
ホームディレクトリにcramfsがあり、/ etc(Cram FSは読み取り専用)のデバイス用にOpenSSHのカスタムビルドを行っていたため、〜/ .ssh / environmentは、FS全体を再構築しないと機能しません。デバイス(組み込みシステムCRAMFSの使用)。sshd_configでauthroized_keysファイルの場所を指定できますが、何らかの理由で、environment =は〜/ .ssh / authroized_keysの環境変数に対してのみ機能します。/ etc / profileの編集はオプションではなく、非標準のディレクトリにsshをロードする必要がありました。session.cのchild_set_env(... "MAIL" ...)の後に、必要な環境変数を追加します(これは私が知っているハックです...)が、誰かがセッションのためにハードコードされたenvを必要とする場合にのみこれを行うことができるソースからコンパイルします。TGI-FLOSS