使用 sudo 时未找到命令
- 2024-10-14 08:40:00
- admin 原创
- 76
问题描述:
我的主文件夹中有一个名为的脚本foo.sh
。
当我导航到该文件夹并输入时./foo.sh
,我得到
-bash: ./foo.sh: Permission denied
。
当我使用时sudo ./foo.sh
,我得到
sudo: foo.sh: command not found
。
为什么会发生这种情况?我该如何解决?
解决方案 1:
没有权限
为了运行脚本,文件必须设置可执行权限位。
为了充分了解 Linux文件权限,您可以研究该命令的文档chmod
。chmod是change mode的缩写,是用于更改文件权限设置的命令。
要阅读本地系统的 chmod 文档,请从命令行运行man chmod
或info chmod
。阅读并理解后,您应该能够理解运行的输出...
ls -l foo.sh
...它将列出文件所有者、组所有者以及文件所有者或文件所属组成员以外的所有人的读、写和执行权限(最后一个权限组有时称为“世界”或“其他”)
以下是针对您的情况如何解决权限被拒绝错误的摘要。
$ 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 用户找不到您的命令的原因可能是PATH
root 的环境变量不包含所在的目录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
请注意,尽管类似,但在这种情况下非特权用户(rkielty)和超级用户的 PATH 中包含的目录并不相同。
所在目录foo.sh
不在 root 用户的 PATH 变量中,因此出现命令未找到错误。
解决方案 2:
到目前为止,我在这里看到的其他解决方案都是基于一些系统定义,但实际上只要正确调用它就可以sudo
使用当前环境PATH
(使用env
命令)和/或其余环境(使用选项):-E
sudo -E env "PATH=$PATH" <command> [arguments]
事实上,我们可以用它创建一个别名:
alias mysudo='sudo -E env "PATH=$PATH"'
(也可以直接命名别名sudo
,替换原来的sudo
。)
解决方案 3:
检查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
解决方案 4:
检查您是否具有该脚本的执行权限。即
chmod +x foo.sh
检查该脚本的第一行是否是
#!/bin/sh
或类似内容。对于 sudo,你位于错误的目录中。请检查
sudo pwd
解决方案 5:
您还可以在超级用户 PATH 中的一个目录 (/usr/local/bin
例如 ) 中创建指向脚本的软链接。然后它将可供 sudo 使用。
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
看一下这个答案,了解应该将软链接放在哪个目录中。
解决方案 6:
即使你明确给出了文件的路径,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
这是一个有点误导性的错误,但从技术上来说可能是正确的。文件只有在可执行时才是一个命令,因此无法找到。
解决方案 7:
如果您在使用上述指南时遇到问题,请尝试使用chmod u+x foo.sh
。chmod +x foo.sh
当其他解决方案不起作用时,这种方法对我有用。
解决方案 8:
关于使用 sudo 时出现“未找到命令”的更简单的方法是编辑 secure_path。
这里完美地描述了:
https: //superuser.com/questions/927512/how-to-set-path-for-sudo-commands
解决方案 9:
好的,这是我的解决方案:在 ~/.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
解决方案 10:
如果您对命令行不太熟悉并且正在使用Ubuntu,您可以按如下方式解决问题:
打开文件所在文件夹窗口
右键单击可执行文件并选择
Properties
转到
Permissions
标签并突出显示Allow executing file as program
通过此解决方案,您可以允许用户将文件作为程序执行,并且不需要 sudo(或更改PATH
root 的环境变量)。
解决方案 11:
好像sudo
没有找到命令
要检查你的系统上是否安装了 sudo 包,请输入sudo
,然后按 Enter 。如果你已经sudo
安装,系统将显示一条简短的帮助消息,否则你会看到类似的内容sudo: command not found
要安装 sudo,请使用 root 帐户运行以下命令之一:
apt-get install sudo
# 如果你的系统基于 apt 包管理器
yum install sudo
# 如果你的系统基于 yum 包管理器
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件