web-dev-qa-db-ja.com

sshコマンドで環境変数を渡すにはどうすればよいですか?

ホストマシンで開始される環境が、選択した特定の環境変数が設定された状態で開始されるように、値をsshコマンドに渡すにはどうすればよいですか?

編集:目標は、現在のkdeデスクトップ(dcop kwin KWinInterface currentDesktopから)を、作成された新しいシェルに渡すことです。これにより、nfsの場所を、元のサーバー上の一意の JEdit インスタンスに戻すことができます。各KDEデスクトップ用。 ( emacsserver / emacsclient などのメカニズムを使用)

複数のsshインスタンスを同時に実行できるのは、環境をセットアップするときに、さまざまなマシンに対してさまざまなsshインスタンスの束を開いているためです。

43
Ross Rogers

~/.ssh/environmentファイルを使用して、リモートコマンドで使用できるようにする変数を設定できます。 sshd設定でPermitUserEnvironmentを有効にする必要があります。

この方法で設定された変数は子プロセスにエクスポートされるため、次のことができます。

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

myscriptは、FooがBarでJoeが37であることを認識します。

18
John T

SendEnvオプションはあなたの役目です。

〜/ .ssh/config:(ローカル)

SendEnv MYVAR

/ etc/ssh/sshd_config:(リモートエンド)

AcceptEnv MYVAR

これで、$MYVARの値がローカルであっても、リモートセッションでも使用できるようになります。
複数回ログインすると、セッションごとに独自の$MYVARのコピーが作成され、値が異なる可能性があります。

~/.ssh/environmentは、他の目的のためのものです。リモートでnon-Shellコマンドを実行すると、$ENVファイルとして機能します。

60
user15617

次のようなコマンドで値を渡すことができます。

ssh username@machine VAR=value cmd cmdargs

次の方法でテストできます。

ssh machine VAR=hello env

Tcshでは次のように動作します:

ssh machine "setenv VAR <value>; printenv"
34
Waltor

恐ろしい、恐ろしいハックもあります。

スクリプトがリモートエンドで変数を使用している場合(つまり、任意の名前を付けることができます)、ロケール変数を悪用することができます。 LC_ *の形式の変数は、設定をまったく必要とせずにそのまま渡されます。

たとえば、クライアントの1つに一連の要塞サーバーがあります。私はそれに接続する必要がありません。毎回別のサーバーに接続するだけです。私は、SSHと同じように動作するスクリプトを持っていますが、賢いという点が異なります。

基本的に、LC_BOUNCE_HOSTSが設定されている場合は、LC_BOUNCE_HOSTSをスペースで分割し、最初のホストを剥離します。次に、跳ね返って同じスクリプトを実行します。宛先ノードでは、このリストは最終的に空になるため、コマンドを実行します。また、LC_BOUNCE_DEBUGによって設定されるデバッグモード(ネットワークのトラブル時に最適)もあります。 sshはこれらすべてを魔法のように渡してくれるので、ホストリストの末尾を認識する以外に何もする必要はありません(これは-オプションで行います)。

これを使うたびに汚れてしまいますが、試してみたところどこでも機能します。

30
Jayson
bla="MyEnvSelection=dcop"
ssh user@Host "export $bla && ./runProg"

Bashで私は以下でテストしました:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@Host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@Host "export $bla && ./readEnv.sh"
1
Zeh