ssh找不到/ usr / local / bin路径

时间:2018-11-27 23:21:38

标签: bash ssh profile

如果我通过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,但这只是一种解决方法。

1 个答案:

答案 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 XCorrect way to use Linux commands in bash script也很重要,但是没有太多信息。

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

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

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

该问题的另一种解决方案是使用代码中命令的完整路径。但是,这会使代码更难以阅读,更难以维护和测试。设置安全的PATH通常是更好的选择。