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にハッキングできると確信していますが、それはクリーンなソリューションではなく、ルートアクセス権がある場合にのみ機能します。
Grawityが言ったように、〜/ .bashrcは非対話型の非ログインシェルをソースとしているため、必要なものです。
デフォルトのUbuntu〜/ .bashrcファイルであなたがしなければならない問題を期待しています。通常、次のようなもので始まります。
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
非対話型のシェルには何でも入れたいbeforeこの行。
~/.bash_login
または~/.bash_profile
をお持ちですか?
インタラクティブモードのBashはこれらのファイルをチェックし、最初の既存のものを次の順序で使用します。
~/.bash_profile
~/.bash_login
~/.profile
したがって、~/.bash_profile
がある場合、~/.profile
に対して行った変更はすべて表示されません。
非インタラクティブモードのBashsometimesは、ファイル~/.bashrc
(多くの場合、インタラクティブスクリプトからsource'dされます)を読み取ります。 「ディストリビューションに依存しているということです。奇妙なことに、これを有効にするためのコンパイル時オプションがあります。 Debianは~/.bashrc
読み取りを有効にしますが、 Archはしません。
ssh
は非インタラクティブモードを使用しているようです。 ~/.bashrc
で十分です。このような問題が発生した場合、通常、実行中のファイルを確認するためにいくつかのエコーを追加します。
sshのドキュメントには次のように書かれています:
コマンドが指定されている場合、ログインシェルの代わりにリモートホストで実行されます。
これが、bashrcファイルへの追加が機能しない理由です。ただし、次のオプションがあります。
PermitUserEnvironment
オプションがsshd構成で設定されている場合、PATH設定を~/.ssh/environment
に追加できます。
ssh remotemachine 'bash -l -c "somecommand"'
あなたはいつも言うことができます:
ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
@signpolymaの答えに加えて、これらの行の前にエクスポートを追加する必要があります
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
自分で同じ問題を抱えていたので、次の方法で解決しました。
ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command