「ssh user @ host command」が機能するように$ PATHを設定するにはどうすればよいですか?


129

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

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


1
export PATH=$PATH:$HOME/new_path〜/ .bash_loginと〜/ .bash_profile(以前に試した〜/ .bashrcと〜/ .profileに加えて)の両方に追加してみました。どちらも機能しません。どちらの場合も、ファイルを作成する必要がありました。
デンバージンジャーリッチ

私の特定の使用例では、sshに送信されるコマンドを変更するのは簡単ではありません。私はstfufs(guru-group.fi/too/sw/stfufs)を使用しています。これは、sshコマンド自体を構築します。その方法は素晴らしい解決策ではないことに気づきましたが、stfufを変更せずにそれを修正するのは良いことです。
デンバージンジャーリッチ

stfufsの方法でsshラッパーを配置し、変更された引数を使用して実際のsshを呼び出すこともできます
Hasturkun

回答:


179

大雑把に言ったように、〜/ .bashrcは非対話型の非ログインシェルによって供給されるため、必要なものです。

私はあなたが抱えている問題がデフォルトのUbuntu〜/ .bashrcファイルに関係していると期待しています。通常は次のようなものから始まります。

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

この行の前に非対話型シェルの何かを置きたいと思います。


1
うん、私はそのexport PATH=$PATH:$HOME/new_path上の行を動かして、それはうまくいった。ありがとう!
デンバージンジャーリッチ

3
.bashrcは信頼できません。man bash:「Bashは、標準入力がネットワーク接続に接続された状態でいつ実行されているかを判別しようとします」。これはRHELでは機能しますが、Archlinuxでは機能しません。/ etc / environmentを編集してデフォルトのPATHを変更する必要がありました
盆地

.zshenvzshユーザー向けの言及を追加する必要があります。他の回答のコメントで見つけるのにかなり時間がかかりました
Mike

30

あなたは持っています~/.bash_login~/.bash_profile

対話モードのbashはこれらのファイルをチェックし、最初の既存のファイルを次の順序で使用します。

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

したがって、を持っている場合~/.bash_profile、変更を行っても何も起こりません~/.profile

非インタラクティブモードのbashは、ファイルを読み取る場合があります~/.bashrc(これは、多くの場合、インタラクティブスクリプトからソースされます)。「ときどき」というのは、それがディストリビューションに依存していることを意味します。 。Debianは~/.bashrc読み取りを可能にしますが、Archはそうではありません。

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


エコーを追加すると役立ちましたが、「ssh -X remotemachine "xterm"」を実行し、/ etc / profileおよび〜/ home / username / .bash_profileからの完全なシステム/ユーザーパスを取得する方法を探しています。コマンドで両方のファイルをソースすると、動作しますが、醜いです:)。
ジェス

「非インタラクティブモードのbashがファイルを読み取る」ことをどのようにして知っていますか~/.bashrc?この説明はマンページにはありません。ありがとう
nknight

4
非対話型の非ログインシェルをsource ~/.bashrcにしたい場合は、環境変数をさらに設定する必要があるようですBASH_ENVsuperuser.com/a/585699/100843を参照してください。非対話型ログインシェルの場合、おそらく、あなたが言及した3つの起動スクリプトの1つを変更する必要があります。
nknight 2013年

3
ZSHのために非対話型のファイルは以下のとおりです。.zshenv
数学

2
@math .zshenvは常にソースです。インタラクティブかどうかは関係ありません。
JoL

19

sshのドキュメントは言う:

commandを指定すると、ログインシェルの代わりにリモートホストで実行されます。

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

  1. PermitUserEnvironmentオプションがsshd設定で設定されている場合、PATH設定を~/.ssh/environment

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


1.それは私のsshd設定で設定されておらずman sshd_config、デフォルトでオフになっていると言っているので、このソリューションがほとんどの人にとってうまくいくとは思えません。2.これは機能しますが、sshに送信されるコマンドを簡単に変更することはできません(私の質問の2番目のコメントを参照)。
デンバージンジャーリッチ

1
1.〜/ .ssh / environmentでは、$ PATHが解決されないため、PATHにパスを追加できないため、期待どおりに機能しません。
not2savvy 2017年

8

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

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'

このソリューションでは、リモートマシンに変更を加える必要はありません。これは良いことです。
Ronny Andersson

2

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

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

私は実際にこれらの行を完全にコメント化しました-Ubuntu 16.04 LTSデスクトップの〜/ .bashrcにあります。すべてが機能するわけではありません。また、PermitUserEnvironmentをyesに設定します。
アーニーS

2

私自身も同じ問題を抱えていて、次のようにして解決しました:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.