web-dev-qa-db-ja.com

「ssh user @ Hostコマンド」が機能するように$ PATHを設定するにはどうすればよいですか?

ssh user@Host commandを介してコマンドを実行するときに使用されるように、新しい$ PATHを設定することはできません。リモートマシンの〜/ .bashrcおよび〜/ .profileにexport PATH=$PATH:$HOME/new_pathを追加しようとしましたが、ssh user@Host "echo \$PATH"を実行すると、変更が反映されていないことがわかります(/ usr/local/sbinが表示されます:/usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games)。リモートマシンはUbuntu 8.04を実行しています。

私はそれを/ etc/profileにハッキングできると確信していますが、それはクリーンなソリューションではなく、ルートアクセス権がある場合にのみ機能します。

123

Grawityが言ったように、〜/ .bashrcは非対話型の非ログインシェルをソースとしているため、必要なものです。

デフォルトのUbuntu〜/ .bashrcファイルであなたがしなければならない問題を期待しています。通常、次のようなもので始まります。

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

非対話型のシェルには何でも入れたいbeforeこの行。

172
singpolyma

~/.bash_loginまたは~/.bash_profileをお持ちですか?

インタラクティブモードのBashはこれらのファイルをチェックし、最初の既存のものを次の順序で使用します。

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

したがって、~/.bash_profileがある場合、~/.profileに対して行った変更はすべて表示されません。

非インタラクティブモードのBashsometimesは、ファイル~/.bashrc(多くの場合、インタラクティブスクリプトからsource'dされます)を読み取ります。 「ディストリビューションに依存しているということです。奇妙なことに、これを有効にするためのコンパイル時オプションがあります。 Debianは~/.bashrc読み取りを有効にしますが、 Archはしません。

sshは非インタラクティブモードを使用しているようです。 ~/.bashrcで十分です。このような問題が発生した場合、通常、実行中のファイルを確認するためにいくつかのエコーを追加します。

29
grawity

sshのドキュメントには次のように書かれています:

コマンドが指定されている場合、ログインシェルの代わりにリモートホストで実行されます。

これが、bashrcファイルへの追加が機能しない理由です。ただし、次のオプションがあります。

  1. PermitUserEnvironmentオプションがsshd構成で設定されている場合、PATH設定を~/.ssh/environmentに追加できます。

  2. ssh remotemachine 'bash -l -c "somecommand"'

20
Hasturkun

あなたはいつも言うことができます:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
6
Chas. Owens

@signpolymaの答えに加えて、これらの行の前にエクスポートを追加する必要があります

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
2
Happy Coding

自分で同じ問題を抱えていたので、次の方法で解決しました。

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
2
Indie