【问题标题】:How do I set $PATH such that `ssh user@host command` works?如何设置 $PATH 以使 `ssh user@host command` 工作?
【发布时间】:2010-10-30 17:52:06
【问题描述】:

我似乎无法设置一个新的 $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 访问权限时才有效。

【问题讨论】:

  • 我已经尝试将export PATH=$PATH:$HOME/new_path 添加到 ~/.bash_login 和 ~/.bash_profile(除了之前尝试过的 ~/.bashrc 和 ~/.profile)。两者都不起作用。在这两种情况下,我都必须创建文件。
  • 在我的特定用例中,修改发送到 ssh 的命令并不容易。我正在使用 stfufs (guru-group.fi/too/sw/stfufs),它自己构建 ssh 命令。我意识到它的方法不是一个很好的解决方案,但是在不修改 stfufs 的情况下修复它会很好。
  • 你可以以 stfufs 的方式放置一个 ssh 包装器,如果这样更容易的话,用修改后的 args 调用真正的 ssh

标签: unix shell path ssh


【解决方案1】:

我自己也遇到了同样的问题,解决了:

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

【讨论】:

    【解决方案2】:

    您有~/.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 -X remotemachine "xterm"' 并从 /etc/profile 获得完整的系统/用户路径和 ~ /home/用户名/.bash_profile。如果我在命令中获取这两个文件,它可以工作.. 但它很丑:)。
    • 你怎么知道“非交互模式下的Bash读取文件~/.bashrc”?我在联机帮助页中没有看到此声明。谢谢
    • 如果你想要一个非交互式非登录shell来source~/.bashrc,看来你需要额外设置环境变量BASH_ENV;见superuser.com/a/585699/100843。对于非交互式登录 shell,您可能必须修改您提到的三个启动脚本之一。
    • 对于 ZSH,非交互式文件是:.zshenv
    • @math .zshenv 总是来源;是否交互无关紧要。
    【解决方案3】:

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

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

    【讨论】:

    • 我实际上只是将这些行全部注释掉了——在 Ubuntu 16.04 LTS 桌面的 ~/.bashrc 中找到。没有一切正常。还将 PermitUserEnvironment 设置为 yes。
    【解决方案4】:

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

    我预计您遇到的问题与默认的 Ubuntu ~/.bashrc 文件有关。它通常以这样的开头:

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

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

    【讨论】:

    • 是的,我将export PATH=$PATH:$HOME/new_path 移到了该行上方,它起作用了。谢谢!
    • .bashrc 不可靠。 man bash:“Bash 尝试确定它何时在其标准输入连接到网络连接的情况下运行”。这适用于 RHEL,但不适用于 Archlinux。我必须编辑 /etc/environment 来更改默认路径
    • 您应该为 zsh 用户添加提及 .zshenv,我花了很长时间才在其他答案的 cmets 中找到它
    • 在 MacOS Catalina 上,我必须将“zshenv”文件放在 /etc/zshenv 中(带有我的导出路径)。
    • @Doomd: ~/.zshenv 不适合你吗?它对我有用......是的,这个答案将受益于被编辑以包含各种其他shell的信息,以及(zsh,fish,......)
    【解决方案5】:

    ssh 文档说:

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

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

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

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

    【讨论】:

    • 1.它没有在我的 sshd 配置中设置,man sshd_config 说默认情况下它是关闭的,所以这个解决方案不太可能适用于大多数人。 2. 这可行,但我不能轻易修改发送到 ssh 的命令(请参阅我的问题的第二条评论)。
    • 1.无法按预期工作,因为在 ~/.ssh/environment 中,您无法将路径添加到 PATH,因为 $PATH 不会被解析。
    【解决方案6】:

    你总是可以说:

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

    【讨论】:

    • 这个方案不需要在远程机器上做任何改动,这是一件好事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2013-04-10
    • 2014-03-26
    • 1970-01-01
    • 2017-04-24
    • 2013-02-15
    • 2017-07-08
    相关资源
    最近更新 更多