如何设置 $PATH 使‘ ssh user@host 命令’工作?

我似乎不能设置一个新的 $PATH,以便在通过 ssh user@host command执行命令时使用它。我试过将 export PATH=$PATH:$HOME/new_path添加到 ~/。Bashrc 和 ~/。配置文件,但是执行 ssh user@host "echo \$PATH"显示更改未被拾取(它显示/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/sbin:/bin:/bin:/bin:/usr/games)。远程机器正在运行 Ubuntu 8.04。

我确信我可以把它黑进/etc/profile,但这不是一个干净的解决方案,而且只有在有 root 访问权限的情况下才能工作。

93552 次浏览

你可以说:

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

你有 ~/.bash_login或者 ~/.bash_profile吗?

Bash 在交互模式下检查这些文件,并按以下顺序使用 第一个存在的:

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

所以如果你有一个 ~/.bash_profile,那么无论你对 ~/.profile做什么改变都不会被发现。

非交互模式下的 Bash 有时候读取文件 ~/.bashrc(它也经常来自交互脚本)我所说的“有时”是指它依赖于发行版: 非常奇怪的是,还有一个启用这个功能的编译时选项。Debian 支持 ~/.bashrc读取,而 Arch 不支持。

ssh似乎使用了非交互模式 所以 ~/.bashrc应该足够了。遇到这样的问题时,我通常会添加一些 echo 来查看正在运行的文件。

Ssh 文档显示:

如果指定了命令,则在远程主机上执行该命令,而不是在登录 shell 上执行该命令。

这就是为什么添加到 bashrc 文件不起作用:

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

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

正如 grawity 所说,~/. bashrc 是您想要的,因为它是由非交互式非登录 shell 提供的。

我希望你遇到的问题和默认的 Ubuntu ~/有关。Bashrc 文件。通常是这样开始的:

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

您希望将非交互式 shell 的任何内容放在 之前这一行。

我自己也有同样的问题,用以下方法解决:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command

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

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