Answers:
没有权限
为了运行脚本,文件必须设置可执行权限。
为了完全了解Linux 文件权限,您可以研究chmod
命令的文档。chmod是change mode的缩写,是用于更改文件的权限设置的命令。
要阅读本地系统的chmod文档,请运行man chmod
或info chmod
从命令行运行。阅读并理解后,您应该能够理解运行的输出...
ls -l foo.sh
...将列出文件所有者,组所有者以及不是文件所有者或文件所属组成员的其他所有人的READ,WRITE和EXECUTE权限(有时会引用最后一个权限组作为“世界”或“其他”)
这是有关如何解决您的情况下“ 拒绝权限”错误的摘要。
$ 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
^ ^ ^
就Linux而言,foo.sh现在是可执行的。
在命令中使用sudo结果未找到
使用sudo运行命令时,实际上是以超级用户或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
请注意,尽管类似,但在这种情况下,PATH中包含的目录(非特权用户(rkielty))和超级用户是不同的。
其中目录foo.sh
所在是不存在于根用户的PATH变量,因此命令没有发现错误。
sudo
的PATH
一样的用户?
到目前为止,我在这里看到的其他解决方案都是基于一些系统定义的,但是实际上可以通过正确调用sudo
当前PATH
(使用env
命令)和/或其余环境(使用-E
选项)来使用:
sudo -E env "PATH=$PATH" <command> [arguments]
实际上,可以使用别名:
alias mysudo='sudo -E env "PATH=$PATH"'
(也可以使用别名本身来sudo
代替原来的别名sudo
。)
command not found
Ubuntu发行版所面临问题的正确且最标准化的解决方案。谢啦。
./bashrc
在会话之间保存它
检查sudo上的secure_path
[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
如果$PATH
被覆盖,请使用visudo
和编辑/etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
尝试chmod u+x foo.sh
,而不是chmod +x foo.sh
如果你有以上的导游麻烦。当其他解决方案不起作用时,这对我有用。