【问题标题】:ssh does not find /usr/local/bin pathssh 找不到 /usr/local/bin 路径
【发布时间】:2019-04-29 18:54:42
【问题描述】:

如果我通过ssh -p22 jenkins@192.168.2.220 登录到我的远程Mac 并键入docker,它会找到可执行文件,因为如果我检查echo $PATH,它还会找到路径/usr/local/bin。但是如果我在文件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 服务而不是整台机器。同时,我已将远程run-docker.sh 脚本上的所有 docker 命令更改为别名${DOCKER},并在脚本开头将其初始化为DOCKER=/usr/local/bin/docker,但这只是一种解决方法。

【问题讨论】:

标签: bash ssh profile


【解决方案1】:

我猜是因为/usr/local/bin 被“jenkins”用户的个人初始化文件(~/.bashrc)添加到PATH 中,所以出现了问题。那只能由交互式 shell 运行,ssh ... '/bin/bash -s' ... 运行的 shell 不是交互式的。

您可以尝试通过使用/bin/bash -i -s 调用shell 来强制shell 进行交互,但这可能会导致其他问题。 (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 通常是更好的选择。

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 2021-03-25
    • 1970-01-01
    • 2019-10-10
    • 2011-06-03
    • 1970-01-01
    • 2017-09-06
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多