gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:29:38 26 4
gpt4 key购买 nike

如果我通过 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 文件,如果在本地调用它就可以工作。

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

最佳答案

我猜问题的发生是因为 /usr/local/bin 被 'jenkins' 用户的个人初始化文件( ~/.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 通常是更好的选择。

关于bash - ssh 找不到/usr/local/bin 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com