2009-06-02 62 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