ホストマシンで開始される環境が、選択した特定の環境変数が設定された状態で開始されるように、値をsshコマンドに渡すにはどうすればよいですか?
編集:目標は、現在のkdeデスクトップ(dcop kwin KWinInterface currentDesktopから)を、作成された新しいシェルに渡すことです。これにより、nfsの場所を、元のサーバー上の一意の JEdit インスタンスに戻すことができます。各KDEデスクトップ用。 ( emacsserver / emacsclient などのメカニズムを使用)
複数のsshインスタンスを同時に実行できるのは、環境をセットアップするときに、さまざまなマシンに対してさまざまなsshインスタンスの束を開いているためです。
~/.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であることを認識します。
SendEnv
オプションはあなたの役目です。
〜/ .ssh/config:(ローカル)
SendEnv MYVAR
/ etc/ssh/sshd_config:(リモートエンド)
AcceptEnv MYVAR
これで、$MYVAR
の値がローカルであっても、リモートセッションでも使用できるようになります。
複数回ログインすると、セッションごとに独自の$MYVAR
のコピーが作成され、値が異なる可能性があります。
~/.ssh/environment
は、他の目的のためのものです。リモートでnon-Shellコマンドを実行すると、$ENV
ファイルとして機能します。
次のようなコマンドで値を渡すことができます。
ssh username@machine VAR=value cmd cmdargs
次の方法でテストできます。
ssh machine VAR=hello env
Tcshでは次のように動作します:
ssh machine "setenv VAR <value>; printenv"
恐ろしい、恐ろしいハックもあります。
スクリプトがリモートエンドで変数を使用している場合(つまり、任意の名前を付けることができます)、ロケール変数を悪用することができます。 LC_ *の形式の変数は、設定をまったく必要とせずにそのまま渡されます。
たとえば、クライアントの1つに一連の要塞サーバーがあります。私はそれに接続する必要がありません。毎回別のサーバーに接続するだけです。私は、SSHと同じように動作するスクリプトを持っていますが、賢いという点が異なります。
基本的に、LC_BOUNCE_HOSTSが設定されている場合は、LC_BOUNCE_HOSTSをスペースで分割し、最初のホストを剥離します。次に、跳ね返って同じスクリプトを実行します。宛先ノードでは、このリストは最終的に空になるため、コマンドを実行します。また、LC_BOUNCE_DEBUGによって設定されるデバッグモード(ネットワークのトラブル時に最適)もあります。 sshはこれらすべてを魔法のように渡してくれるので、ホストリストの末尾を認識する以外に何もする必要はありません(これは-オプションで行います)。
これを使うたびに汚れてしまいますが、試してみたところどこでも機能します。
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"