如果我通过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
执行,它在/usr/local/bin
中找不到PATH
,因此由于命令未知而无法运行docker。
在远程Mac上,有一个文件run-docker.sh
,这是一个bash文件,它调用docker命令,并且在本地调用时可以工作。
为解决此问题,我在PermitUserEnvironment
的Mac上启用了sshd_config
,但这没有用。虽然我只重新启动了ssh服务,而不是整个机器。同时,我已将远程run-docker.sh
脚本上的所有docker命令更改为别名${DOCKER}
,并在脚本开头将其初始化为DOCKER=/usr/local/bin/docker
,但这只是一种解决方法。
答案 0 :(得分:1)
我猜测是由于“詹金斯”用户的个人初始化文件(/usr/local/bin
)将PATH
添加到~/.bashrc
而引起的。那只能由交互式shell运行,而ssh ... '/bin/bash -s' ...
运行的shell不是交互式的。
您可以尝试通过用/bin/bash -i -s
调用外壳来强制外壳交互,但这可能会导致其他问题。 (shell可能会尝试并无法设置作业控制。PS1
的值可能会出现在输出中。...)
通常,您不能依赖为程序正确设置PATH
。有关问题的详尽分析,请参见Setting the PATH in Scripts - Scripting OS X。 Correct way to use Linux commands in bash script也很重要,但是没有太多信息。
一种简单且可靠的永久解决问题的方法是在run-docker.sh
的开头显式设置所需的PATH。例如:
export PATH=/bin:/usr/bin:/usr/local/bin
如果run-docker.sh
运行其他位置的程序,则可能需要在路径中添加其他目录。
该问题的另一种解决方案是使用代码中命令的完整路径。但是,这会使代码更难以阅读,更难以维护和测试。设置安全的PATH
通常是更好的选择。