使用sudo时未找到命令

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

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

-bash: ./foo.sh: Permission denied

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

sudo: foo.sh: command not found

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

267453 次浏览
  1. 检查您是否拥有脚本的执行权限。例如chmod +x foo.sh
  2. 检查脚本的第一行是否为#!/bin/sh或类似的内容。
  3. 对于sudo,您在错误的目录。检查sudo pwd

没有权限

为了运行脚本,文件必须具有可执行权限位集

为了充分理解Linux 文件权限,你可以学习chmod命令的文档。修改文件权限改变模式的缩写,是用来改变文件权限设置的命令。

要阅读本地系统的chmod文档,请从命令行运行man chmodinfo chmod。一旦阅读和理解了,你应该能够理解运行…

ls -l foo.sh

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

下面是如何在你的情况下排除权限被拒绝错误故障的摘要。

$ 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运行命令时,你实际上是作为超级用户或根用户运行它。

根用户找不到你的命令的原因很可能是根的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所在的目录没有出现在根用户的PATH变量中,因此出现了命令未找到错误。

检查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

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

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

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

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

(也可以将别名本身命名为sudo,取代原来的sudo。)

似乎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

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

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

# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
export PATH=$PATH:/home/your_user/bin
fi
< p >瞧! 现在你可以使用sudo或设置为ROOT执行自己的脚本,而不必每次都执行导出PATH=$PATH:/home/your_user/bin

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

你也可以在超级用户PATH中的一个目录(例如/usr/local/bin)中创建一个到你的脚本的软链接。然后sudo就可以使用它了。

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

看一看这个答案来了解把软链接放在哪个目录中。

如果你在上面的指南中遇到问题,可以尝试chmod u+x foo.sh而不是chmod +x foo.sh。当其他的解都没有的时候,这个对我有用。

sudo命令似乎没有找到

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

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

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

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

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

这是完美的描述: https://superuser.com/questions/927512/how-to-set-path-for-sudo-commands < / p >

在Ubuntu中,右键单击可执行文件并选择Properties,转到Permissions选项卡并突出显示Allow executing file as program enter image description here