$ 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
所有者具有读写访问权限,但是 - 表示缺少可执行权限
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
^ ^ ^
8 回答
Permission denied
为了运行脚本,文件必须具有 an executable permission bit set .
为了完全理解Linux file permissions,您可以学习
chmod
命令的文档 . chmod,更改模式的缩写,是用于更改文件权限设置的命令 .要读取本地系统的chmod文档,请从命令行运行
man chmod
或info chmod
. 一旦阅读并理解,您应该能够理解运行的输出.........将列出文件所有者,组所有者以及不是文件所有者的所有其他人或文件所属组的成员的READ,WRITE和EXECUTE权限(最后一个权限组有时被称为作为“世界”或“其他”)
以下是在您的情况下如何解决 Permission Denied error 的摘要 .
所有者具有读写访问权限,但是 - 表示缺少可执行权限
chmod
命令修复了这个问题 . (组和其他只对文件设置了读权限,不能写入或执行它)就Linux而言,foo.sh现在是可执行的 .
Using sudo results in Command not found
使用 sudo 运行命令时,您实际上是以超级用户或root身份运行它 .
root用户未找到您的命令的原因可能是root的
PATH
环境变量不包含foo.sh
所在的目录 . 因此找不到命令 .PATH环境变量包含搜索命令的目录列表 . 每个用户根据需要设置自己的PATH变量 . 查看设置运行的内容
以下是以普通用户身份运行上述
env
命令的一些示例输出,然后是使用sudo的root用户请注意,虽然类似,但在这种情况下,PATH中包含的目录,非特权用户(rkielty)和超级用户不一样 .
foo.sh
所在的目录不存在于root用户的PATH变量中,因此找不到命令错误 .其他解决方案我实际上可以通过正确调用它来使用当前的
PATH
(使用env
命令)和/或环境的其余部分(使用-E
选项)_117339_s .事实上,人们可以用它来制造别名:
(也可以将别名命名为
sudo
,替换原始sudo
. )检查sudo上的 secure_path
如果正在覆盖
$PATH
,请使用visudo
并编辑/etc/sudoers
检查您是否具有脚本的执行权限 . 即
chmod +x foo.sh
检查该脚本的第一行是
#!/bin/sh
还是其中的一行 .对于sudo,你在错误的目录中 . 检查
sudo pwd
您还可以在超级用户PATH中的某个目录(例如
/usr/local/bin
)中创建指向脚本的软链接 . 它随后可供sudo使用 .看看this answer,了解将软链接放入哪个目录 .
即使你明确地给出了文件的路径,linux似乎也会说“命令未找到” .
这是一个有点误导的错误,但它可能在技术上是正确的 . 文件在其可执行文件之前不是命令,因此无法找到 .
好的,这是我的解决方案:在〜/ .bash_aliases中添加以下内容:
瞧!现在,您可以使用sudo执行自己的脚本或设置为ROOT,而无需每次都执行导出PATH = $ PATH:/ home / your_user / bin .
请注意,在添加PATH时我需要明确,因为超级用户的HOME是/ root
如果您在使用上述指南时遇到问题,请尝试
chmod u+x foo.sh
而不是chmod +x foo.sh
. 当其他解决方案没有时,这对我有用 .