182

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

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

-bash: ./foo.sh: Permission denied.

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

sudo: foo.sh: command not found.

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

4

11 回答 11

188

没有权限

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

为了完全理解 Linux文件权限,您可以研究该chmod命令的文档。chmod是change mode的缩写,是用于更改文件权限设置的命令。

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

ls -l foo.sh

...这将列出文件所有者、组所有者以及不是文件所有者或文件所属组成员的其他所有人的 READ、WRITE 和 EXECUTE 权限(有时称为最后一个权限组作为“世界”或“其他”)

以下是如何解决您的案例中的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 具有读写权限 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 身份运行它。

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

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

env | grep ^PATH

这是首先以普通用户身份运行上述env命令,然后以 root 用户身份使用 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

请注意,虽然相似,但在这种情况下,非特权用户 (rkielty) 和超级用户在 PATH 中包含的目录并不相同

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

于 2012-10-21T14:17:13.693 回答
128

到目前为止我在这里看到的其他解决方案是基于一些系统定义的,但实际上可以通过正确调用它来sudo使用当前PATH(使用env命令)和/或环境的其余部分(使用-E选项) :

sudo -E env "PATH=$PATH" <command> [arguments]

事实上,可以用它做一个别名:

alias mysudo='sudo -E env "PATH=$PATH"'

(也可以命名别名本身sudo,替换原来的sudo。)

于 2015-04-01T20:53:16.520 回答
29

检查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
于 2013-09-01T16:46:02.700 回答
6
  1. 检查您是否具有脚本的执行权限。IEchmod +x foo.sh
  2. 检查该脚本的第一行是否是#!/bin/sh这样的。
  3. 对于 sudo,您位于错误的目录中。检查sudo pwd
于 2012-10-21T09:08:22.577 回答
5

您还可以/usr/local/bin在超级用户 PATH 中的某个目录(例如)中创建指向脚本的软链接。然后它将可供 sudo 使用。

chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo

查看此答案以了解将软链接放入哪个目录。

于 2016-08-20T20:29:41.750 回答
2

即使您明确给出文件的路径,linux 似乎也会说“找不到命令”。

[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0

这是一个有点误导性的错误,但它在技术上可能是正确的。文件在可执行文件之前不是命令,因此无法找到。

于 2015-07-28T13:56:34.033 回答
2

如果您对上述指南有疑问,请尝试chmod u+x foo.sh代替。chmod +x foo.sh当其他解决方案没有时,这对我有用。

于 2017-07-13T15:09:37.663 回答
0

好的,这是我的解决方案:在 ~/.bash_aliases 中添加以下内容:

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

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

请注意,添加 PATH 时我需要明确,因为超级用户的 HOME 是 /root

于 2016-06-01T03:56:05.953 回答
-1

关于使用 sudo 时的“找不到命令”,更简单的方法是编辑secure_path。

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

于 2021-09-14T13:43:48.960 回答
-1

在 Ubuntu 中,右键单击可执行文件并选择Properties,转到Permissions选项卡并突出显示Allow executing file as program 在此处输入图像描述

于 2022-01-13T09:39:29.997 回答
-3
似乎sudo找不到命令

要检查 sudo 包是否安装在您的系统上,请键入sudo,然后按 Enter 。如果你已经sudo安装了系统会显示一个简短的帮助信息,否则你会看到类似sudo: command not found

要安装 sudo,请使用 root 帐户运行以下命令之一:

apt-get install sudo # 如果你的系统基于apt包管理器

yum install sudo # 如果你的系统基于 yum 包管理器

于 2020-09-15T21:50:27.720 回答