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
通常是更好的选择。
如果我通过 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
通常是更好的选择。