Linux下执行一些命令前加sudo时出现command not found的原因

本文深入解析了在Linux环境下使用sudo命令执行命令时,为何会出现command not found错误的问题,以及sudo命令背后的执行机制。通过解释sudo如何在父进程基础上创建子进程,并以root权限执行命令,阐述了为何非系统内置命令无法用sudo以root权限执行的原因。

转载请注明来自“柳大的CSDN博客”:http://blog.csdn.net/poechant


    当我们用sudo来执行cd、ls等命令时,会出现command not found的提示:

sudo cd /home/michael
sudo: command not found

    我们知道在执行Linux命令时,如果在其前面加上sudo,就表示以root权限执行。但是这其实是有一个前提的,就是只有那些Linux内置系统命令才可以用如此的形式来执行,而对于Shell内置命令或其他用户自定义命令、别名等,是不能用sudo来使用root权限的。为什么呢?详细说一下sudo幕后隐藏的过程才能明白。


    因为当在Linux下用sudo执行某一命令时,是在原进程(parent process)的基础上fork出来一个子进程(child process),这个子进程是以root权限执行的。然后在子进程中,执行你在sudo后面跟的命令。


    在子进程中是无法调用涉及到父进程的状态的一些命令的,所以非系统内置命令会被拒绝。这就是为什么会出现command not found的提示。具体来说,当我们执行:

sudo cd /home/michael

    所在这个shell进程中(称其为PP,表示parent process)fork出一个子进程(称其为CP,表示child process),那么在CP中是无法改变PP的所在目录的。

sudo ls /home/michael

    sudo后由PP产生了CP,CP是无法获取PP所在的目录的内容的(具体来说,是读取该目录的block data,可详见《柳大的Linux游记·基础篇(2)Linux文件系统的inode》一文)。


转载请注明来自“柳大的CSDN博客”:http://blog.csdn.net/poechant

-

在使用 Linux 或类 Unix 系统,用户可能会遇到 `sudo: command not found` 错误。该错误通常表示系统无法识别 `sudo` 命令,这可能由多种原因引起。以下是可能导致此问题的常见原因及对应的解决方案: ### 1.用户没有使用 `sudo` 的权限 在某些系统中,`sudo` 命令默认未安装或当用户不属于 `sudo` 或 `wheel` 组。可以通过以下方式检查并修复: - 确保当用户属于 `sudo` 组(Debian/Ubuntu)或 `wheel` 组(CentOS/Fedora): ```bash groups ``` - 如果未入相应组,可使用 `usermod` 添: ```bash usermod -aG sudo <username> # Debian/Ubuntu usermod -aG wheel <username> # CentOS/Fedora ``` ### 2. `sudo` 命令未安装或路径未设置 某些最小化安装的 Linux 系统可能没有默认安装 `sudo`,或者 `PATH` 环境变量未包含 `/usr/bin` 或 `/usr/local/bin`。 - 检查 `sudo` 是否安装: ```bash which sudo ``` - 如果未安装,可以尝试使用 `su` 切换到 root 并安装: ```bash su -c "apt install sudo" # Debian/Ubuntu su -c "yum install sudo" # CentOS 6/7 su -c "dnf install sudo" # Fedora/CentOS 8 ``` - 确保 `PATH` 环境变量包含 `/usr/bin`: ```bash export PATH=/usr/bin:$PATH ``` ### 3. `sudo` 命令路径被误删或损坏 如果 `/usr/bin/sudo` 被手动删除或文件损坏,系统将无法找到该命令- 可以尝试重新安装 `sudo` 包: ```bash su -c "apt reinstall sudo" # Debian/Ubuntu su -c "yum reinstall sudo" # CentOS su -c "dnf reinstall sudo" # Fedora ``` ### 4. 使用了不支持 `sudo` 的最小化 shell 在某些容器环境或最小化 shell 中,`sudo` 可能被完全移除,仅保留 `su`。 - 可以尝试直接使用 `su` 登录 root 并进行操作: ```bash su ``` ### 5. 用户误操作导致 `sudo` 权限丢失 如果用户错误地修改了 `/etc/sudoers` 文件,可能导致 `sudo` 不再对任何用户生效。 - 使用 `pkexec` 或 `su` 编辑 `/etc/sudoers` 文件并恢复默认配置: ```bash pkexec visudo ``` - 确保包含以下行: ``` %sudo ALL=(ALL:ALL) ALL # Debian/Ubuntu %wheel ALL=(ALL:ALL) ALL # CentOS/Fedora ``` ### 6. 系统文件损坏或磁盘错误 在极少数情况下,系统文件损坏或磁盘错误可能导致 `sudo` 命令无法执行- 运行文件系统检查工具以修复磁盘错误: ```bash fsck /dev/sdXn ``` ###
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值