如何设置$ PATH以便`ssh user @ host command`起作用?


129

我似乎无法设置新的$ PATH,以使其在通过执行命令时使用ssh user@host command。我尝试将其添加export 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,但这不是一个干净的解决方案,它仅在具有root访问权限的情况下才有效。


1
我尝试添加export PATH=$PATH:$HOME/new_path到〜/ .bash_login和〜/ .bash_profile(除了先前尝试过的〜/ .bashrc和〜/ .profile)之外。都不行。在这两种情况下,我都必须创建文件。
丹佛·金格里奇2009年

在我的特定用例中,修改发送到ssh的命令并不容易。我正在使用stfufs(guru-group.fi/too/sw/stfufs),它本身会构建ssh命令。我意识到它的方法不是一个很好的解决方案,但是无需修改stfufs就可以对其进行修复。
丹佛·金格里奇2009年

您可以按stfufs的方式放置ssh包装器,并使用经过修改的args调用真正的ssh,如果那样更容易的话
Hasturkun

Answers:


179

就像grawity所说的那样,〜/ .bashrc是您想要的,因为它是由非交互式非登录外壳程序提供的。

我希望您遇到的问题与默认的Ubuntu〜/ .bashrc文件有关。通常以以下内容开头:

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

您想此行之前为非交互式外壳放置任何内容。


1
是的,我把export PATH=$PATH:$HOME/new_path那条线移到了上面,并且奏效了。谢谢!
丹佛·金格里奇2009年

3
.bashrc是不可靠的。man bash:“ Bash尝试确定何时将其标准输入连接到网络连接上运行”。这适用于RHEL,但不适用于Archlinux。我必须编辑/ etc / environment才能更改默认的PATH
盆地

您应该.zshenv为zsh用户添加提及,我花了相当长的时间才能在其他答案的评论中找到它
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
如果要使用非交互式非登录外壳程序~/.bashrc,似乎需要另外设置环境变量BASH_ENV;请参阅superuser.com/a/585699/100843。对于非交互式登录外壳,您可能必须修改您提到的三个启动脚本之一。
2013年

3
对于ZSH,非交互式文件为:.zshenv
数学

2
@math .zshenv总是来源;互动与否无关紧要。
光明审判

19

ssh文档说:

如果指定了命令,那么它将在远程主机而不是登录外壳上执行。

这就是为什么无法添加到bashrc文件的原因。但是,您确实有以下选择:

  1. 如果PermitUserEnvironment在sshd配置中设置了该选项,则可以将PATH设置添加到~/.ssh/environment

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


1.它未在我的sshd配置中设置,并man sshd_config说默认情况下处于关闭状态,因此该解决方案不太可能对大多数人有用。2.这可以工作,但是我不能轻易修改发送给ssh的命令(请参阅有关我的问题的第二条评论)。
丹佛·金格里奇2009年

1
1.不能按预期方式工作,因为在〜/ .ssh / environment中,您无法将路径添加到PATH,因为$ PATH将无法解析。
not2savvy

8

您可以随时说:

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

此解决方案不需要在远程计算机上进行任何更改,这是一件好事。
罗尼·安德森

2

除了@signpolyma答案,您还必须在这些行之前添加导出

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

我实际上只是完全注释掉了这些行-在Ubuntu 16.04 LTS桌面的〜/ .bashrc中找到。没有一切正常。还将PermitUserEnvironment设置为yes。
Ernie S

2

我自己也遇到了同样的问题,可以通过以下方法解决:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.