为什么通过 sudo 和 su 运行时 PATH 变量不同?

为什么通过 sudo 和 su 运行时 PATH 变量不同?

在我的 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)中,并且不会获得定期更新。

因此我想这些程序不被认为是那么安全,并且默认情况下不会放入根路径中。

相关内容