仅在终端中使用“sudo”时才找到命令

仅在终端中使用“sudo”时才找到命令

我使用的是 Debian 9。有些命令如果我sudo之前没有正确输入,则无法找到。我可以禁用此功能吗?

我有 Arch Linux,但它没有这个安全功能。我的用户在管理员组中。

答案1

我不会称其为安全功能。

如果在环境变量指定的目录中找到可执行文件,则可以通过其唯一名称运行它PATH。在我的 Debian 9 中,文件/etc/profile定义基本PATH如下:

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

这意味着对于任何具有 UID 的用户0(在我的 Debian 中仅限于root)默认值为

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

(目录以 分隔:),对于其他用户来说

PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"

我称其为“默认”,因为通常/etc/profile会为任何用户加载,但用户可以自行更改PATH。通常~/.profile这样做是一个好的文件。

当您运行 时sudo some_commandsudo将使用另一组目录而不是。此集合可能在配置(, )PATH中的某个地方定义,也可能没有定义。如果没有明确定义,则表示默认值为sudo/etc/sudoers/etc/sudoers.d/*/etc/sudoers

secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

(这在某种程度上是简化的,其他选项可能会改变这种机制;man 5 sudoers有关详细信息,请参阅)。

请注意,PATHforrootsecure_pathused bysudo包含几个命名的目录sbin(位于不同位置),而PATHfor general user 没有。这些目录中包含主要供 使用的 工具root

因此,如果sudo some_command找到可执行文件而 solesome_command没有找到,那是因为some_command位于secure_path但不在您的 中的目录之一中PATH

但这不是安全功能。任何用户都可以将所有这些sbin目录添加到他们自己的 中PATH,因此输入后,some_commandshell 将尝试运行可执行文件。或者他们可以使用完整路径,如/sbin/some_command。然后真正的安全功能就会启动:

  • 文件权限可能不允许非 root 用户运行它(尽管在 Debian 9 中许多(所有?)系统可执行文件可以由任何用户运行);
  • 文件运行但无法访问基本资源,因此抛出错误并退出(例如/sbin/hwclock);
  • 该文件运行并使用一些身份验证代理来提升权限sudo(这样的文件很可能bin首先被放置在,例如:)/bin/systemd
  • 或者文件成功运行,因为您可以运行它,尽管它在sbin(例如/sbin/discover在我的 Debian 中)。

您的用户帐户未设置some_command为在没有它的情况下运行sudo,因为作为普通用户,您不需要它。但是如果您无论如何都需要它,只需使用其完整路径并获取它(whereis some_command可能有用)。PATH用所有这些sbin目录填充您的目录只会使您的制表符补全变得混乱(例如在 Bash 中)。


Tab 补全功能值得解释一下。以 Bash 为例,它就是一个具有此功能的 shell。shellPATH在其环境中有,它可以读取它,因此如果你输入another_com并点击,它可以根据你的tab提示在某处找到它。如果在 中的某个地方,则不会找到它。another_commandPATHsome_commandsbinsome_com tab

仍然sudo some_com tab可能会找到它。这可能看起来很奇怪,因为 shell 无法知道 ,rootPATH无法读取/etc/sudoers等等。发生的事情是 shell 暂时将公共sbin目录添加到PATH仅执行此搜索。这是在文件 内部完成的/usr/share/bash-completion/completions/sudo,相关行是

local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin

回答你的明确问题

我可以禁用该功能吗?

是的,你可以将sbin目录添加到你的。但如果真的需要(而且很多命令确实需要),PATH这将不允许你成功运行命令。sudosudo

答案2

在 Debian 中,$PATHroot 用户(或使用时sudo)的默认环境变量包含/sbin//usr/sbin//usr/local/sbin/目录,而非 root 用户(即使在组中等sudo)在默认情况下没有这些目录$PATH

user@LM193:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
user@LM193:~$ sudo -i
[sudo] password for user: 
root@LM193:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@LM193:~# 

相关内容