ssh 没有找到 /usr/local/bin 路径

ssh does not find /usr/local/bin path

如果我通过 ssh -p22 jenkins@192.168.2.220 登录我的远程 Mac 并键入 docker,它会找到可执行文件,因为如果我检查它也会找到路径 /usr/local/bin echo $PATH。但是如果我在文件 setup-mac.sh 的 heredoc 中做同样的事情,比如

#!/bin/bash
ssh jenkins@192.168.2.220 '/bin/bash -s' << 'EOF'
"echo $PATH" 
"bash run-docker.sh"
EOF

我通过 shell 和 bash setup-mac.sh 执行它在 PATH 中找不到 /usr/local/bin 因此没有 运行 docker,因为命令未知。

在远程Mac上,有一个文件run-docker.sh,它是一个调用docker命令的bash文件,如果在本地调用它就可以工作。

为了解决这个问题,我在 sshd_config 中的 mac 上启用了 PermitUserEnvironment,但这没有用。虽然我只重启了 ssh 服务而不是整个 machine。同时,我已将远程 run-docker.sh 脚本上的所有 docker 命令更改为别名 ${DOCKER},并在脚本开头将其初始化为 DOCKER=/usr/local/bin/docker,但这只是解决方法。

我猜想问题的发生是因为 /usr/local/bin 被 'jenkins' 用户的个人初始化文件 (~/.bashrc) 添加到 PATH。即 运行 只能通过 shell 交互,而 shell 运行 通过 ssh ... '/bin/bash -s' ... 不能交互。

您可以尝试通过使用 /bin/bash -i -s 调用 shell 来强制它进行交互,但这可能会导致其他问题。 (shell 可能会尝试设置作业控制但会失败。PS1 的值可能会出现在输出中。...)

一般来说,您不能指望为程序正确设置 PATH。 See Setting the PATH in Scripts - Scripting OS X for a thorough analysis of the problem. 也是相关的,但没有太多信息。

永久解决问题的一种简单可靠的方法是在 run-docker.sh 的开头明确设置所需的 PATH。例如:

export PATH=/bin:/usr/bin:/usr/local/bin

如果 run-docker.sh 运行 程序位于其他位置,您可能需要将其他目录添加到路径中。

该问题的另一个解决方案是在代码中使用命令的完整路径。然而,这使得代码更难阅读、更难维护和更难测试。设置保险箱 PATH 通常是更好的选择。