Contents

使用sudo时修复“找不到的命令”错误

1. 概述

在本教程中,我们将回顾使用sudo 时出现“找不到命令”错误的原因,并探索可能的修复方法。

2. Linux $PATH变量

Linux $PATH变量指定在执行命令时要搜索的以冒号分隔的目录列表。例如,这个变量的默认值通常是*/usr/bin:/usr/local/bin*, 它告诉shell在我们执行命令时搜索*/usr/bin/usr/local/bin* 。这允许我们只使用ls而不是*/usr/bin/ls来执行ls*。

如果我们从*$PATH中删除/usr/bin*,将找不到ls

$ echo $PATH
/usr/bin:/usr/local/bin
$ ls
Downloads Files Music ...
$ PATH=/usr/local/bin
$ ls
/bin/sh: ls: not found

我们可以通过设置*PATH=”$PATH:/path/to/my/directory:/path/to/another/directory” *来添加额外的目录。

假设我们在*$HOME/bin目录中有一个名为“ myscript ”的脚本,我们想要执行它而不需要每次都输入完整路径。我们只需将$HOME/bin添加到$PATH*:

$ myscript
/bin/sh: myscript: not found
$ PATH="$PATH:$HOME/bin"
$ myscript 
My Script!
$ which myscript
/home/blogdemo/bin/myscript

3.运行脚本时“权限被拒绝”

有时我们在尝试运行脚本时会遇到“权限被拒绝”的错误。如果脚本没有设置可执行位并且被视为文本文件,则会发生这种情况。

我们可以运行带有*+x*标志的chmod 来将文件标记为可执行文件:

$ echo "echo Hello" > myscript
$ ./myscript
/bin/sh: ./myscript: Permission denied
$ chmod +x ./myscript 
$ ./myscript 
Hello

4.修复“未找到命令”错误

如果我们设置了自定义*$PATH来运行我们的脚本,则可能会出现“找不到命令”错误。**这是因为sudo*可能会在新环境下执行命令,而不是继承修改后的环境变量。**

4.1. 修复单个命令的错误

我们可以将*-E标志传递给sudo*以使其保留当前环境变量:

$ echo $PATH
/usr/bin:/home/blogdemo/bin
$ myscript 
My Script Run As blogdemo
$ sudo myscript
sudo: myscript: command not found
$ sudo -E myscript
My Script Run As root

这里myscript位于*/home/blogdemo/bin*。

4.2. 永久修复错误

要永久修复此错误,我们可以将sudo配置为始终继承*$PATH变量,或者通过修改/etc/sudoers为其手动设置$PATH*。

首先,我们需要运行visudo打开*/etc/sudoers文件进行修改。现在,我们可以使用env_keep选项让sudo继承$PATH*:

Defaults  env_keep += "PATH"

除此之外,我们还可以使用secure_path选项对*$PATH进行硬编码,其中/path/to/my/directory*是我们要附加的目录:

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/path/to/my/directory"

*我们应该注意, secure_path的值是硬编码的,如果我们修改$PATH*变量,它不会动态更新。因此,必须手动修改/etc/sudoers