【问题标题】:Command not found with sudo, but works without sudo用 sudo 找不到命令,但不用 sudo 也能工作
【发布时间】:2019-05-30 06:34:54
【问题描述】:

我在/home/me/go/binGOPATH 中安装了一个二进制dep 以供使用。

运行dep 成功执行二进制文件,但运行sudo dep 导致sudo: dep: command not found

$ dep
Dep is a tool for managing dependencies for Go projects

Usage: "dep [command]"
...

Use "dep help [command]" for more information about a command.

$ sudo dep
sudo: dep: command not found

路径不是这里的问题:

$ echo $PATH
/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/var/lib/snapd/snap/bin:/home/me/.local/bin:/home/me/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin

$ sudo echo $PATH
/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/var/lib/snapd/snap/bin:/home/me/.local/bin:/home/me/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin

路径与mesuperuser 相同,都引用密钥目录/home/me/go/bin

为什么在没有sudo 的情况下运行dep 会成功但使用sudo 会导致command not found

【问题讨论】:

  • $PATHsudo 运行之前扩展;试试sudo sh -c 'echo "$PATH"'

标签: bash command sudo


【解决方案1】:

默认情况下,sudo 不会将用户的原始 PATH 传递给超级用户进程,它会获取系统上定义的一些默认 PATH。如果你运行“sudo env”来查看sudo'ed进程的整个环境,这很容易看到:

$ sudo 环境 |路径 PATH=/sbin:/bin:/usr/sbin:/usr/bin

您尝试的命令“sudo echo $PATH”不会检查任何内容,因为 shell 首先将 $PATH 转换为该变量具有的任何值 - 然后才调用命令 (sudo),因此它只会打印您的外部环境的价值:-)

要让你的 PATH 在 sudo 中传递,你可以这样做:

$ sudo PATH=$PATH sh -c env |路径 PATH=/usr/share/Modules/bin:/usr/lib64/ccache:/home/nyh/gaps:/home/nyh/bin:/usr/local/bin:/usr/bin:/usr/X11R6/bin :/bin:/usr/sbin:/sbin:/usr/games:/usr/local/android-sdk-linux/tools:/usr/local/android-sdk-linux/platform-tools:/home/nyh/谷歌云 SDK/bin

基本上,我传递给 sudo 运行的命令是通过将 PATH 设置为 $PATH 开始的(请记住,在 sudo 运行之前,$PATH 由外壳扩展,我想要的真实路径也是如此!)并运行一个 shell (它将使用这个新的 PAT)来“env”。如您所见, env 确实找到了正确的路径。你可以用你想运行的任何程序替换“env”。

【讨论】:

  • 好答案。话虽如此(如果您不介意在系统路径区域“乱扔垃圾”),只需将它们放入 /usr/local/bin 用于自定义二进制文件,将它们放入 /usr/local/sbin 用于需要 sudo 的自定义脚本是一个简单的解决方案。在许多发行版 $PATH 语句中,该特定区域 /usr/local/- 是常见的“第一击”。这意味着它在/bin//sbin/ 之前首先查看。
最近更新 更多