使用 sudo 时找不到命令怎么办?

我的 home 文件夹里有一个名为:foo.sh 的脚本

导航到这个文件夹,并输入./foo.sh

-bash: ./foo.sh: Permission denied

当我使用sudo ./foo.sh

sudo: foo.sh: command not found

为什么会发生这种情况?

原文由 Neko 发布,翻译遵循 CC BY-SA 4.0 许可协议
阅读 3.5k
2 个回答

没有权限

运行脚本,文件必须 设置可执行许可位

想要更好的理解 Linux 文件权限,可以研究 chmod 命令的文档。 chmodchange mode 的缩写,是用于更改文件权限设置的命令。

要阅读本地系统的 chmod 文档,请从命令行运行 man chmodinfo chmod 。一旦阅读并理解,应该能够理解运行的输出......

 ls -l foo.sh

...这将列出文件所有者、组所有者以及不是文件所有者或文件所属组成员的其他所有人的 READ、WRITE 和 EXECUTE 权限(有时称为最后一个权限组作为“world”或“other”)

以下是如何解决提问案例中 Permission Denied 错误 的说明。

 $ ls -l foo.sh                    # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh
    ^^^
 ^^^ | ^^^   ^^^^^^^ ^^^^^
  |  |  |       |       |
Owner| World    |       |
     |          |    Name of
   Group        |     Group
             Name of
              Owner

Owner 具有读写权限 rw 但 - 表示缺少可执行权限

chmod 命令修复了这个问题。 (group和other只对文件设置了读取权限,不能写入或执行它)

 $ chmod +x foo.sh               # The owner can set the executable permission on foo.sh
$ ls -l foo.sh                  # Now we see an x after the rw
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
   ^  ^  ^

就 Linux 而言,foo.sh 现在是可执行的。

使用 sudo 导致找不到命令

使用 sudo 运行命令时,实际上是以超级用户或 root 身份运行它。

root 用户没有找到你的命令的原因可能是 PATH root 的环境变量不包括 _foo.sh 所在的目录_。因此找不到该命令。

PATH 环境变量包含搜索命令的目录列表。每个用户根据自己的需要设置自己的 PATH 变量。查看它设置为运行什么

env | grep ^PATH

以下是运行上述 env 命令的一些示例输出,首先以普通用户身份运行,然后以 root 用户身份使用 sudo

 rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

请注意,虽然相似,但在这种情况下,非特权用户 (rkielty) 和超级用户在 PATH 中包含的目录 _并不相同_。

foo.sh 所在的目录不在 root 用户的 PATH 变量中,因此 找不到命令 错误。

原文由 Rob Kielty 发布,翻译遵循 CC BY-SA 3.0 许可协议

到目前为止,我在这里看到的其他解决方案都是基于一些系统定义,但实际上可以让 sudo 使用当前的 PATH (使用 env 命令)和/或环境的其余部分(使用 -E 选项)只需正确调用它:

 sudo -E env "PATH=$PATH" <command> [arguments]

事实上,可以用它做一个别名:

 alias mysudo='sudo -E env "PATH=$PATH"'

(也可以将别名本身命名为 sudo ,替换原来的 sudo

原文由 Tom 发布,翻译遵循 CC BY-SA 3.0 许可协议
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题