我有一个名为 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 chmod
或 info 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
所在的目录,因此出现找不到命令错误。