使用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 。