web-dev-qa-db-ja.com

XForwardingが正しい$ PATHをロードしない

次のコードを使用して、NetBeansをラップトップにXForwardしようとしました。

# This does not work
$ ssh [email protected] -Y netbeans
which: no javac in (/usr/bin:/bin:/usr/sbin:/sbin)
which: no Java in (/usr/bin:/bin:/usr/sbin:/sbin)
Cannot find Java. Please use the --jdkhome switch.

それは機能しませんでしたが、これは機能しました:

# This works
$ ssh [email protected] -Y
user@home $ netbeans

私の質問:

  • 最初の方法が失敗するのはなぜですか?
  • 最初の方法を機能させるにはどうすればよいですか?
2
Stefan

ssh example.com somecommandはあなたの~/.profileを読みません; somecommandは、sshデーモンによって直接実行されます。コマンドを指定しない場合、sshデーモンはログインシェルを呼び出し、~/.profileを読み取ります。 (ログインシェルに応じて、~/.bash_profile~/.zprofile、または~/.loginに置き換えてください。)

非対話型コマンドの環境変数を設定する方法はいくつかありますが、それらはすべてサーバー構成で設定する必要があり、通常はデフォルトでオフになっています。両側で最近十分なOpenSSHを想定します。

  • ~/.ssh/configSendEnvディレクティブを使用して、クライアントからサーバーに環境変数を送信できます。特定の環境変数は、 サーバー構成AcceptEnvディレクティブで有効にする必要があります。

  • サーバー側で ~/.ssh/environment を介して環境変数を設定できます。これは、 サーバー構成PermitUserEnvironmentディレクティブを使用して有効にする必要があります。

  • キーベース認証を使用している場合は、Originごとの変数を ~/.ssh/authorized_keys に設定することもできます。関連する行の先頭にenvironment="FOO=bar"を追加します。ここでも、サーバー構成にPermitUserEnvironmentディレクティブが必要です。

サーバー構成を変更できない、または変更したくない場合は、リモートコマンドへのフルパスを書き込むか、リモートコマンドで.profileを明示的に取得する必要があります。

ssh [email protected] -Y '. ~/.profile; netbeans'
ssh [email protected] -Y '/path/to/netbeans'

ssh(1)マニュアルページ (私の強調)から:

コマンドを指定すると、ログインシェルのリモートホストではなくで実行されます。

つまり、sshにコマンドを渡しても、リモートシステムに「ログイン」することはありません。シェルを非ログイン、非対話モードで実行します。これにより、異なる初期化ファイルのセットが実行されます。

PATH変数が設定されている場所を確認し、それを適切なファイルに移動する必要があります。たとえば、シェルがbashの場合、.bashrcではなく.bash_profileを使用する必要があります。

1
Juliano