在使用sudo时找不到命令

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

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

-bash: ./foo.sh: Permission denied

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

sudo: foo.sh: command not found

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

没有权限

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

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

要读取本地系统的chmod文档,请从命令行运行man chmodinfo 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的身份有效地运行它。

root用户找不到你的命令的原因很可能是root的PATH环境variables不包括foo.sh所在目录 。 因此找不到命令。

PATH环境variables包含search命令的目录列表。 每个用户根据自己的需要设置自己的PATHvariables。 看看它是什么设置运行

 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 

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

foo.sh所在的目录不存在于root用户的PATHvariables中,因此该命令未find错误。

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

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

事实上,人们可以用它来表示别名:

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

(也可以将别名命名为sudo ,replace原来的sudo 。)

检查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 
  1. 检查您是否具有脚本的执行权限。 即chmod +x foo.sh
  2. 检查该脚本的第一行是否是#!/bin/sh或其他。
  3. 对于sudo,你在错误的目录中。 检查与sudo pwd

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

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

看看这个答案有一个想法,把软链接在哪个目录。

看起来,即使你明确地给出文件的path,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 

这是一个有点误导性的错误,但它可能在技术上是正确的。 一个文件不是一个命令,直到它的可执行文件,所以不能被发现。

好吧,这是我的解决scheme:在〜/ .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

如果您在上述指南中遇到问题,请尝试使用chmod u+x foo.sh代替chmod +x foo.sh 当其他解决scheme没有时,这对我有用。