- 当在用户登录会话下运行时,在运行期间
sudo <command>
会更改$PATH
为 root吗?$PATH
sudo <command>
如果
<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
最小环境中执行命令。TERM
PATH
HOME
SHELL
LOGNAME
USER
USERNAME
env_check
env_keep
出于安全原因,/etc/sudoers
可以secure_path
选择将保险箱设置PATH
为sudo
:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
如果依赖于用户的$PATH,而不是root的$PATH,用户如何能够成功运行sudo?
PATH
因为当您运行时可以保留用户的sudo
。你总是可以这样做:
sudo env "PATH=$PATH" <command>
答案2
这实际上是依赖于配置。有一个env_reset
选项sudoers
与env_check
和结合使用env_delete
,控制是否替换、扩展或传递部分或全部环境变量,包括PATH
.
默认行为是启用env_reset
并重置PATH
。该值PATH
设置为可以通过选项控制secure_path
,否则由用户配置决定。
您可以禁用env_reset
或添加PATH
来env_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.