小编典典

使用 sudo 时找不到命令

all

foo.sh我的主文件夹中有一个脚本。

当我导航到此文件夹并输入./foo.sh时,我得到

-bash: ./foo.sh: Permission denied.

当我使用sudo ./foo.sh时,我得到

sudo: foo.sh: command not found.

为什么会发生这种情况,我该如何解决?


阅读 90

收藏
2022-07-17

共1个答案

小编典典

没有权限

为了运行脚本,文件必须 设置可执行权限位

为了完全理解
Linux文件权限,您可以研究该chmod命令的文档。chmod是 change mode 的缩写,是用于更改文件权限设置的命令。

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

ls -l foo.sh

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

以下是如何解决您的案例中的 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命令解决了这个问题。(组和其他只对文件设置了读取权限,他们不能写入或执行它)

$ 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 用户没有找到您的命令的原因很可能是PATHroot 的环境变量不包括 所在的 目录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.shroot 用户的 PATH 变量中不存在所在目录,因此找不到 命令 错误。

2022-07-17