sudo 命令是否会暂时将 $PATH 更改为 root 的路径?

sudo 命令是否会暂时将 $PATH 更改为 root 的路径?
  1. 当在用户登录会话下运行时,在运行期间sudo <command>会更改$PATH为 root吗?$PATHsudo <command>
  2. 如果<command>依赖用户的$PATH,而不是root的$PATH,用户怎么能运行sudo <command>成功呢?

    • 一种方法是sudo su成为 root,将 root 更改 $PATH 为用户的,然后<command>直接运行。这就是我解决问题的方法 如何指定更高的ruby版本来安装gem?

    • 有什么更简单的方法吗?

    • 不从用户切换到root可以完成吗?

答案1

在用户登录会话下运行 sudo 时,是否会在 sudo 运行期间将 $PATH 更改为 root 的 $PATH ?

sudo将更改$PATH变量,取决于您的安全策略。从sudo 手册页:

PATH
    May be overridden by the security policy.

在大多数系统中,默认情况下启用该选项,这会导致在包含、、、、和以及和sudoers 选项允许的调用进程中的变量的env_reset最小环境中执行命令。TERMPATHHOMESHELLLOGNAMEUSERUSERNAMEenv_checkenv_keep

出于安全原因,/etc/sudoers可以secure_path选择将保险箱设置PATHsudo

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

如果依赖于用户的$PATH,而不是root的$PATH,用户如何能够成功运行sudo?

PATH因为当您运行时可以保留用户的sudo。你总是可以这样做:

sudo env "PATH=$PATH" <command>

答案2

这实际上是依赖于配置。有一个env_reset选项sudoersenv_check和结合使用env_delete,控制是否替换、扩展或传递部分或全部环境变量,包括PATH.

默认行为是启用env_reset并重置PATH。该值PATH设置为可以通过选项控制secure_path,否则由用户配置决定。

您可以禁用env_reset或添加PATHenv_keep更改该行为,但请注意,它可能不会达到您想要的总体效果 -sbin根目录中通常有一些目录 ( )PATH不在您的用户目录中。您可以启用setenv以允许覆盖环境来单次执行sudo使用-E选项sudo

所有这些都可以在您的发行版的默认配置中进行更改。运行sudo visudo以查看sudoers文件中当前的内容。


还有其他方法。一种简单的方法是使用sudo内置的环境变量设置或env:

sudo PATH="$PATH" command ...
sudo env PATH="$PATH" command ...

都将仅使用当前用户的PATH.您也可以以相同的方式设置其他变量,这通常很有用。您的配置可能不允许其中一项或多项。

答案3

您需要获得交互式登录 root shell 吗?

sudo -H -i

man sudo

 -H          The -H (HOME) option requests that the security policy set the HOME environment variable to the home directory of the
             target user (root by default) as specified by the password database.  Depending on the policy, this may be the default
             behavior.


 -i [command]
             The -i (simulate initial login) option runs the shell specified by the password database entry of the target user as a
             login shell.  This means that login-specific resource files such as .profile or .login will be read by the shell.  If a
             command is specified, it is passed to the shell for execution via the shell's -c option.  If no command is specified,
             an interactive shell is executed.  sudo attempts to change to that user's home directory before running the shell.  The
             security policy shall initialize the environment to a minimal set of variables, similar to what is present when a user
             logs in.  The Command Environment section in the sudoers(5) manual documents how the -i option affects the environment
             in which a command is run when the sudoers policy is in use.

相关内容