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

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

-bash: ./foo.sh:拒绝访问。

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

Sudo: foo.sh:命令未找到。

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


当前回答

没有权限

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

为了充分理解Linux文件权限,您可以研究chmod命令的文档。Chmod是change mode的缩写,用于修改文件的权限设置。

如果需要阅读本地系统的chmod文档,请在命令行中执行man chmod或info chmod命令。一旦阅读和理解了,你应该能够理解运行…

ls -l foo.sh

... 它将列出文件所有者、组所有者和其他非文件所有者或文件所属组成员的READ、WRITE和EXECUTE权限(最后一个权限组有时被称为“world”或“other”)。

下面是如何在您的情况下排除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具有读写权限,但“-”表示缺少可执行权限

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的PATH环境变量不包括foo.sh所在的目录。因此没有找到该命令。

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

env | grep ^PATH

下面是首先作为普通用户运行上述env命令,然后作为使用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

注意,虽然类似,但在这种情况下,PATH、非特权用户(rkielty)和超级用户中包含的目录是不一样的。

foo.sh所在的目录没有出现在root用户的PATH变量中,因此命令没有发现错误。

其他回答

这是我的解决方案: 在~ /。Bash_aliases只需添加以下内容:

# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
   export PATH=$PATH:/home/your_user/bin 
fi

瞧! 现在,您可以使用sudo或设置为ROOT执行自己的脚本,而不必每次都执行导出PATH=$PATH:/home/your_user/bin。

注意,在添加PATH时需要显式添加,因为超级用户的HOME是/root

检查您是否拥有脚本的执行权限。即chmod +x foo.sh 检查脚本的第一行是否为#!/bin/sh之类的。 对于sudo,您在错误的目录。与sudo PWD确认

关于使用sudo时“命令未找到”,更少的黑客方式是编辑secure_path。

这里描述得很完美: https://superuser.com/questions/927512/how-to-set-path-for-sudo-commands

没有权限

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

为了充分理解Linux文件权限,您可以研究chmod命令的文档。Chmod是change mode的缩写,用于修改文件的权限设置。

如果需要阅读本地系统的chmod文档,请在命令行中执行man chmod或info chmod命令。一旦阅读和理解了,你应该能够理解运行…

ls -l foo.sh

... 它将列出文件所有者、组所有者和其他非文件所有者或文件所属组成员的READ、WRITE和EXECUTE权限(最后一个权限组有时被称为“world”或“other”)。

下面是如何在您的情况下排除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具有读写权限,但“-”表示缺少可执行权限

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的PATH环境变量不包括foo.sh所在的目录。因此没有找到该命令。

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

env | grep ^PATH

下面是首先作为普通用户运行上述env命令,然后作为使用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

注意,虽然类似,但在这种情况下,PATH、非特权用户(rkielty)和超级用户中包含的目录是不一样的。

foo.sh所在的目录没有出现在root用户的PATH变量中,因此命令没有发现错误。

It seems sudo command not found

输入sudo,按“Enter”,查看是否安装了sudo软件包。如果你安装了sudo,系统将显示一个简短的帮助消息,否则你将看到类似sudo: command not found的东西

安装sudo时,以root帐号执行如下命令:

如果您的系统基于apt包管理器

如果您的系统基于yum包管理器