在我的 Fedora VM 上,当使用我的用户帐户运行时,我/usr/local/bin
的路径中有:
[justin@justin-fedora12 ~]$ env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
运行时也是如此su
:
[justin@justin-fedora12 ~]$ su -
Password:
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
但是,当运行 via 时sudo
,该目录不在路径中:
[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin
为什么运行via时路径会不同sudo
?
答案1
看一眼/etc/sudoers
。 Fedora(以及 RHEL、Ubuntu 等)中的默认文件包含以下行:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
这可以确保在 sudo 下运行二进制文件时您的路径是干净的。这有助于避免一些问题在这个问题中注意到。如果您没有/sbin
并且/usr/sbin
按照自己的方式进行操作,这也很方便。
答案2
该命令su -
将执行 root 用户配置文件并采用该用户的环境(包括路径等),但sudo
不会执行此操作。
如果您想sudo
这样做,请使用将执行用户配置文件的su -
选项sudo -i [command
如果您想su -
这样做sudo
,请不要使用连字符 - 只需使用su [command]
答案3
你可以检查为什么(这是不同的)通过运行sudo sudo -V
.
例如在 Linux 上运行:
$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
注意:在 macOS/BSD 上,只需运行:sudo sudo -V
.
由于某些 Linux 发行版中的默认安全策略插件,上述列表受到限制。
这在以下进一步解释man sudoers
:
如果
secure_path
设置了该选项,则其值将用于PATH
环境变量。
secure_path
- 从 sudo 运行的每个命令所使用的路径。如果您不相信运行 sudo 的人有一个健全的PATH
环境变量,您可能需要使用它。另一个用途是如果您希望将“根路径”与“用户路径”分开。该选项指定的组中的用户
exempt_group
不受 影响secure_path
。默认情况下未设置此选项。
如果是这种情况,您可以通过运行sudo visudo
和编辑配置文件并修改secure_path
(添加以 分隔的额外路径:
)或将您的用户添加到exempt_group
(这样您就不会受到secure_path
选项的影响)来更改它。
或者为了传递用户的PATH
临时值,您可以运行:
sudo env PATH="$PATH" my_command
你可以通过以下方式检查:
sudo env PATH="$PATH" env | grep ^PATH
也可以看看:如何制作sudo
保存$PATH
?
环境可能不同的另一个原因sudo
是您可以在文件env_reset
中启用选项sudoers
。这会导致命令在新的最小环境中执行。
所以你可以使用env_keep
选项(不推荐安全原因)来保留用户的环境变量:
Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"
答案4
在大多数 Linux 中,您通过包管理来安装程序,并定期获取更新。如果您安装了一些绕过包管理的东西,它将被安装在 /usr/local/bin (例如,或 .../sbin 或 /opt)中,并且不会获得定期更新。
因此我想这些程序不被认为是那么安全,并且默认情况下不会放入根路径中。