2009-06-02 10 views
112

ssh [email protected] commandでコマンドを実行するときに使用されるように、新しい$ PATHを設定できないようです。リモートマシンの〜/ .bashrcと〜/ .profileにexport PATH=$PATH:$HOME/new_pathを追加しようとしましたが、ssh [email protected] "echo \$PATH"を実行すると、変更が取得されていないことが示されます(/ usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games)。リモートマシンはUbuntu 8.04を実行しています。

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

+0

をエクスポートを追加する必要があります〜/ .bashrcと〜/ .profileに加えて〜/ .bash_loginと〜/ .bash_profileの両方にPATH = $ PATH:$ HOME/new_path'をエクスポートします。どちらも動作しません。どちらの場合も、ファイルを作成する必要がありました。 –

+0

私の特定のユースケースでは、sshに送信されたコマンドを変更するのは簡単ではありません。私はstfufs(http://www.guru-group.fi/too/sw/stfufs/)を使用しています。これはsshコマンド自体を構築します。私はそのメソッドが素晴らしい解決策ではないことを認識していますが、stfufsを変更せずに修正するのは良いことです。 –

+0

stfufsの方法でsshラッパーを置くことができます。簡単な場合は、変更されたargsを使って実際のsshを呼び出してください。 – Hasturkun

答えて

152

を設定あなたのPATHを追加することができます、〜/ .bashrcは、非対話型の非ログインシェルがソースとなっているので、あなたが望むものです。

あなたは、デフォルトのUbuntu〜/ .bashrcファイルと関係があります。これは通常、このようなもので始まる:

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

あなたはこの行の前に非対話型シェルのために何を載せていきたいと思います。

+1

うん、私は 'export PATH = $ PATH:$ HOME/new_path'をその行の上に移動して動作しました。ありがとう! –

+2

.bashrcは信頼できません。 man bash: "Bashは、ネットワーク接続に接続された標準入力で実行されているときを判断しようとします"。これはRHELでは動作しますが、Archlinuxでは動作しません。私はデフォルトのPATHを変更するために/ etc/environmentを編集しなければならなかった – basin

6

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

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

このソリューションはリモートマシン上で変更する必要はありません。 –

29

あなたは~/.bash_login~/.bash_profileを持っていますか?だから、

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

あなたの場合:

これらのファイルのための対話モードチェックでバッシュ、とはこの順で、既存の最初に使用しています~/.bash_profileがある場合は、に変更してくださいは見えないままになります。非対話型モードで

バッシュ時々はファイル~/.bashrc読み込み「時々」私はそれが分布依存性であることを意味することで(また多くの場合、対話式スクリプトからsource'dされる。):非常に奇妙な、そこにありますこれを可能にするためのコンパイル時オプション。 Debianは~/.bashrcの読み取りを有効にします。アーチはありません。

sshは非対話モードを使用しているようですが、だから~/.bashrcで十分です。このような問題が発生した場合は、通常、どのファイルが実行されているかを確認するためにいくつかのエコーを追加します。

+0

エコーを追加すると助けになりました...しかし、私はまだssh -X remotemachine "xterm"を実行する方法を追いかけていて、/ etc/profileと〜/ home/username/.bash_profileからフルシステム/ 。コマンドで両方のファイルを取得すると、それは動作しますが、その醜いです:)。 – Jess

+0

"非対話モードのBashはファイル'〜/ .bashrc'を読み込んでいることをどのように知っていますか?私はこの声明がマンページに表示されていません。ありがとう – nknight

+3

非対話型の非ログインシェルが '〜/ .bashrc'をソースしたい場合、環境変数' BASH_ENV'を追加設定する必要があるようです。 http://superuser.com/a/585699/100843を参照してください。非対話型のログインシェルの場合は、あなたが言及した3つの起動スクリプトのうちの1つを修正する必要があります。 – nknight

18

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

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

これは、bashrcファイルへの追加が機能しない理由です。ただし、以下のオプションがあります:PermitUserEnvironmentオプションはsshdの設定ファイルに設定されている場合grawityが言ったように

  1. 、あなたは

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

  2. ~/.ssh/environmentから
+0

1.これは私のsshd configには設定されておらず、 'man sshd_config'はデフォルトではオフになっていると言っていますので、この解決法はほとんどの人にとってはうまくいかないでしょう。 2.これはうまくいくが、私はsshに送られたコマンドを簡単に変更することはできない(私の質問の2番目のコメントを参照)。 –

+1

1.〜/ .ssh /環境で$ PATHが解決されないため、PATHにpathesを追加できないため、期待通りに動作しません。 – not2savvy

2

ちょうど、同じ問題を自分で持っていたとそれを解決:@signpolyma答えに加えて

ssh [email protected] PATH=\$HOME/bin:\$PATH\; remote-command 
2

、私は `追加しようとしているこれらの行の前に

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

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

関連する問題