使用sudo时找不到命令

时间:2012-10-21 09:01:17

标签: linux bash sudo

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

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

-bash: ./foo.sh: Permission denied

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

sudo: foo.sh: command not found

为什么会发生这种情况以及如何解决?

10 个答案:

答案 0 :(得分:134)

权限被拒绝

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

为了完全理解Linux file permissions,您可以学习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 

所有者具有读写访问权限,但是 - 表示缺少可执行权限

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

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

env | grep ^PATH

以下是以普通用户身份运行上述env命令的一些示例输出,然后是使用sudo的root用户

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)和超级用户不是相同的

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

答案 1 :(得分:73)

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

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

事实上,人们可以用它来制造别名:

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

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

答案 2 :(得分:12)

在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

答案 3 :(得分:6)

  1. 检查您是否拥有该脚本的执行权限。即chmod +x foo.sh
  2. 检查该脚本的第一行是#!/bin/sh还是其他一些。
  3. 对于sudo,你在错误的目录中。查看sudo pwd

答案 4 :(得分:3)

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

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

查看this answer,了解将软链接放入哪个目录。

答案 5 :(得分:1)

似乎linux会说&#34;命令未找到&#34;即使你明确地给出了文件的路径。

[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

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

上面有很好的答案。如果在尝试使用它们后仍然得到 void tokenize(char *line, char **words, int *nwords); int main() { char line[MAX_LINE], *words[MAX_WORDS], message[MAX_LINE]; int stop=0,nwords=0; while(1) { printf("OSP CLI $ "); /* my code*/ if (NULL==fgets(line , MAX_LINE, stdin)) return 0; printf("%s",line); /* my code ends */ /* read a line of text here */ tokenize(line,words,&nwords); /* --Not using this code as i found my own--- if (strcmp (words[0], "exit")==0) return 0; */ if (strcmp(line,"exit") == 0) break; ,请使用整个文件路径再试一次:

command not found

答案 9 :(得分:-2)

似乎找不到sudo命令

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

的信息。

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

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

yum install sudo#如果您的系统基于yum软件包管理器