我使用的是 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_command
,sudo
将使用另一组目录而不是。此集合可能在配置(, )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
有关详细信息,请参阅)。
请注意,PATH
forroot
和secure_path
used bysudo
包含几个命名的目录sbin
(位于不同位置),而PATH
for general user 没有。这些目录中包含主要供 使用的 工具root
。
因此,如果sudo some_command
找到可执行文件而 solesome_command
没有找到,那是因为some_command
位于secure_path
但不在您的 中的目录之一中PATH
。
但这不是安全功能。任何用户都可以将所有这些sbin
目录添加到他们自己的 中PATH
,因此输入后,some_command
shell 将尝试运行可执行文件。或者他们可以使用完整路径,如/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_command
PATH
some_command
sbin
some_com
tab
仍然sudo some_com
tab可能会找到它。这可能看起来很奇怪,因为 shell 无法知道 ,root
也PATH
无法读取/etc/sudoers
等等。发生的事情是 shell 暂时将公共sbin
目录添加到PATH
仅执行此搜索。这是在文件 内部完成的/usr/share/bash-completion/completions/sudo
,相关行是
local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
回答你的明确问题
我可以禁用该功能吗?
是的,你可以将sbin
目录添加到你的。但如果真的需要(而且很多命令确实需要),PATH
这将不允许你成功运行命令。sudo
sudo
答案2
在 Debian 中,$PATH
root 用户(或使用时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:~#