IT源码网

linux之使用 sudo 时找不到命令

mengfanrong 2024年10月24日 程序员 39 0

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

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

-bash: ./foo.sh: Permission denied

当我使用sudo ./foo.sh时,我明白

sudo: foo.sh: command not found .

为什么会发生这种情况以及如何解决它?

请您参考如下方法:

权限被拒绝

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

为了全面了解Linux file permissions您可以研究 chmod 命令的文档。 chmod更改模式的缩写,是用于更改文件权限设置的命令。

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

ls -l foo.sh 

...它将列出文件所有者、组所有者以及非文件所有者或文件所属组成员的其他所有人的读、写和执行权限(最后一个权限组有时称为“世界”或“其他”)

以下总结了如何解决您遇到的权限被拒绝错误问题。

$ 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  

所有者具有读写权限 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 
   ^  ^  ^ 

foo.sh 现在可以在 Linux 上执行。

在命令中使用 sudo 结果找不到

当您使用sudo运行命令时,您实际上是以 super 用户或根用户身份运行它。

root 用户找不到您的命令的原因可能是 root 的 PATH 环境变量不包含 foo.sh 所在的目录。因此找不到该命令。

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

env | grep ^PATH 

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

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) 和 super 用户的 PATH 中包含的目录不相同

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


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!