2009-06-02 55 views
112

我似乎無法通過ssh [email protected] command執行命令時,設置一個新的$ PATH使得它被使用。我曾嘗試加入export PATH=$PATH:$HOME/new_path在〜/ .bashrc和〜/ .profile文件在遠程機器上,但在執行ssh [email protected] "echo \$PATH"表明更改尚未回升(它顯示在/ usr/local/sbin中:在/ usr/local/bin目錄:/ usr/sbin目錄:在/ usr/bin中:/ sbin目錄:/ bin中:在/ usr /遊戲)。遠程機器正在運行Ubuntu 8.04。

我敢肯定,我可以砍它到/ etc/profile文件,但是這不是一個乾淨的解決方案,當一個人有root訪問它纔會起作用。

+0

我曾嘗試添加`之前增加您的出口export PATH = $ PATH:$ HOME/new_path`到〜/ .bash_login和〜/ .bash_profile(除了以前試過的〜/ .bashrc和〜/ .profile)。兩者都不起作用。在這兩種情況下,我都必須創建該文件。 – 2009-06-02 16:49:31

+0

在我的特殊用例中,修改發送給ssh的命令並不容易。我正在使用stfufs(http://www.guru-group.fi/too/sw/stfufs/),它構建了ssh命令本身。我意識到它的方法並不是一個很好的解決方案,但是修正它並不修改stfufs會很好。 – 2009-06-02 17:22:20

+0

你可以用stfufs的方式放一個ssh包裝器,用修改過的參數調用真正的ssh,如果這更容易 – Hasturkun 2009-06-02 20:25:31

回答

152

,〜/ .bashrc就是你想要的,因爲它是由非交互式非登錄shell產生的。

我希望你遇到的問題與Ubuntu默認的〜/ .bashrc文件來完成。它通常始於這樣的事情:

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

你想提出非交互shell什麼此行之前。

6

你可以總是說:

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

這個解決方案在遠程機器上不需要任何改變,這是一件好事。 – 2016-09-14 18:56:16

29

你有一個~/.bash_login~/.bash_profile

猛砸在交互模式會檢查這些文件,並使用第一現有,順序如下:

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

所以,如果你有~/.bash_profile,那麼無論你更改做~/.profile將被忽略。

猛砸在非交互模式有時讀取文件~/.bashrc(也往往是從交互腳本source'd。)通過「有時」我的意思是,這是分佈依賴:很奇怪的是,有一個編譯時選項來啓用它。 Debian支持~/.bashrc的讀取,例如Arch沒有。

ssh似乎是使用非交互模式,所以所以~/.bashrc應該是足夠的。遇到這樣的問題時,我通常會添加幾個echo來查看正在運行的文件。

+0

添加回聲有助於......但我仍在追蹤執行'ssh -X remotemachine「xterm」'的方法,並從/ etc/profile和〜/ home/username/.bash_profile獲得完整的系統/用戶路徑。如果我在命令中輸入這兩個文件,它可以工作,但它很醜陋:)。 – Jess 2013-04-03 22:18:44

+0

你怎麼知道「非交互模式下的Bash讀取文件`〜/ .bashrc`」?我在手冊頁中看不到這個聲明。謝謝 – nknight 2013-05-01 22:45:09

18

SSH文檔說:

如果指定命令,則遠程主機,而不是登錄殼上執行。

這就是爲什麼添加到bashrc文件不起作用。然而,你有以下幾種選擇:

  1. 如果PermitUserEnvironment選項在sshd的配置設置,您可以添加路徑grawity說設置爲~/.ssh/environment

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

2

剛剛有同樣的問題我自己,以解決它:

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

除了@signpolyma答案,你會有這些行

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