![](/img/trans.png)
[英]Command not found when executed as sudo, but works after "sudo su"
[英]Command not found when using sudo
我的主文件夹中有一个名为foo.sh
的脚本。
当我导航到此文件夹并输入./foo.sh
,我得到
-bash: ./foo.sh: Permission denied
。
当我使用sudo ./foo.sh
,我得到
sudo: foo.sh: command not found
。
为什么会发生这种情况,我该如何解决?
没有权限
为了运行脚本,文件必须设置一个可执行权限位。
为了全面了解 Linux 文件权限,您可以研究chmod
命令的文档。 chmod是change mode的缩写,是用于更改文件权限设置的命令。
要阅读本地系统的 chmod 文档,请从命令行运行man chmod
或info 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
所有者具有读写权限 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
环境变量不包括foo.sh
所在的目录。 因此找不到该命令。
PATH 环境变量包含搜索命令的目录列表。 每个用户根据自己的需要设置自己的 PATH 变量。 查看它设置为运行的内容
env | grep ^PATH
这是首先以普通用户身份然后以 root 用户身份使用 sudo 运行上述env
命令的一些示例输出
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 中包含的目录并不相同。
root 用户的 PATH 变量中不存在foo.sh
所在的目录,因此找不到命令错误。
到目前为止,我在这里看到的其他解决方案基于一些系统定义,但实际上可以让sudo
使用当前的PATH
(使用env
命令)和/或环境的其余部分(使用-E
选项)只需正确调用它:
sudo -E env "PATH=$PATH" <command> [arguments]
事实上,我们可以用它做一个别名:
alias mysudo='sudo -E env "PATH=$PATH"'
(也可以将别名本身命名为sudo
,替换原来的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
chmod +x foo.sh
#!/bin/sh
或类似内容。sudo pwd
您还可以在超级用户 PATH 的目录之一(例如/usr/local/bin
)中创建指向脚本的软链接。 然后它将可供 sudo 使用。
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
看看这个答案,以了解将软链接放入哪个目录。
即使您明确给出了文件的路径,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
这是一个有点误导性的错误,但它在技术上可能是正确的。 文件在可执行文件之前不是命令,因此无法找到。
如果您在上述指南中遇到问题,请尝试chmod u+x foo.sh
而不是chmod +x foo.sh
当其他解决方案没有时,这对我有用。
好的,这是我的解决方案:在 ~/.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
上面有很好的答案。 如果在尝试使用它们之后仍然command not found
,请使用整个文件路径再试一次:
sudo /home/user/path/to/foo.sh
关于使用 sudo 时“未找到命令”的问题,更简单的方法是编辑 secure_path。
这里有完美的描述: https : //superuser.com/questions/927512/how-to-set-path-for-sudo-commands
sudo
命令
要检查您的系统上是否安装了 sudo 软件包,请键入sudo
,然后按 Enter 。 如果您安装了sudo
,系统将显示一条简短的帮助消息,否则您将看到类似sudo: command not found
要安装 sudo,请使用 root 帐户运行以下命令之一:
apt-get install sudo
# 如果你的系统基于 apt 包管理器
yum install sudo
# 如果你的系统基于 yum 包管理器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.