SUNT的随手记

闲的时候,做一些对自己有益的事

0%

使用sudo提升权限提示:command not found

bandwhich 是一个网络带宽监控工具,通常需要超级用户权限来访问网络接口信息。当bandwhich安装在普通用户下,直接运行 sudo bandwhich 报错 command not found 的原因与 sudo 命令使用的环境变量(尤其是 PATH 变量)有关。 当你使用 sudo 运行一个命令时,默认情况下,sudo 会切换到超级用户(root)的权限来执行该命令,sudo 使用了 root 用户的 PATH 环境变量,而 bandwhich 的可执行文件配置在普通用户的PATH 环境变量中,所以系统会提示 command not found。可以通过指定绝对路径、使用 env 传递用户的 PATH 或配置 sudoers 文件来解决这个问题。

具体原因:

  1. 不同的 PATH 环境变量

    • **普通用户的 PATH**:普通用户的 PATH 变量通常包含 /usr/local/bin/usr/bin 等路径,这些路径存放了普通用户安装的应用程序。
    • **root 用户的 PATH**:当你使用 sudo 切换到 root 用户时,PATH 变量可能没有包含普通用户的路径,如 /usr/local/bin,这是你通过 sudo 运行 bandwhich 时报错的原因。bandwhich 很可能是安装在 /usr/local/bin 或类似的目录下,而这个目录不在 root 用户的 PATH 中。
  2. sudo 默认行为
    sudo 会在执行命令时加载 root 用户的环境变量(包括 PATH),而不是普通用户的环境变量。所以当 bandwhich 不在 root 的 PATH 变量中时,sudo 就找不到它。

解决方法:

有几种方法可以解决这个问题。

1. 使用绝对路径运行

使用 sudo 加上 bandwhich 的绝对路径,可以通过运行 command -v bandwhich 来查找 bandwhich 的绝对路径,然后将其传递给 sudo

1
sudo $(command -v bandwhich)

逐步解释:

  • command -v bandwhich:这个部分会输出 bandwhich 命令的完整路径。command -v 用于找到某个命令的可执行文件路径。例如,command -v bandwhich 可能返回 /usr/local/bin/bandwhich

  • $(...):这是一个命令替换语法,表示运行括号中的命令,并将其输出作为外部命令的一部分。也就是说,$(command -v bandwhich) 会被替换为 bandwhich 命令的绝对路径。

  • sudo:以超级用户权限运行后面的命令。

实际执行的命令:假设 bandwhich 的路径是 /usr/local/bin/bandwhich,那么这个命令最终会等效于:

1
sudo /usr/local/bin/bandwhich

这确保了你用 sudo 运行的是 bandwhich 命令的绝对路径,不会受到环境变量 PATH 的影响,避免了如果 PATH 中有同名的恶意文件的潜在风险。

2. 修改 sudoPATH

你可以通过 env 命令传递当前用户的 PATH 环境变量给 sudo

1
sudo env "PATH=$PATH" bandwhich

逐步解释:

  • sudo:以超级用户权限运行命令。

  • env "PATH=$PATH"env 命令用于在新环境中运行命令。"PATH=$PATH" 意思是将当前用户的 PATH 环境变量传递给 sudo。通常 sudo 会以 root 用户的环境变量运行命令,但通过设置 env,你可以指定使用当前用户的 PATH 环境变量,而不是默认的 root 用户的 PATH

  • bandwhich:接下来运行的命令就是 bandwhich

这将使用当前用户的 PATH 来运行 bandwhich,从而确保 sudo 能找到 bandwhich 命令。

3. 在 /etc/sudoers 中保持用户的环境变量

你可以通过编辑 sudoers 文件,保持当前用户的 PATH 环境变量。

使用 sudo visudo 编辑 /etc/sudoers 文件,添加如下行:

1
Defaults env_keep += "PATH"

这会告诉 sudo 在执行命令时,保留用户的 PATH 环境变量,而不是切换到 root 的 PATH