事实上,只需正确调用它就可以使用
sudo
当前环境PATH
(使用env
命令)和/或其余环境(使用选项):-E
sudo -E env "PATH=$PATH" <command> [arguments]
事实上,我们可以用它来创建一个别名:
alias mysudo='sudo -E env "PATH=$PATH"'
(也可以命名别名本身
sudo
,替换原来的sudo
。)
为什么在命令中sudo
使用当前而不是选项?PATH
env
-E
为什么要通过选项而不是命令来sudo
使用环境的其余部分?-E
env
这PATH
是环境的一部分吗?
PATH
相对于其他环境有什么特别之处?
谢谢。
sudo 在执行外部命令时尝试确保安全。为了防止命令欺骗,sudo 检查“.”。在用户的 PATH 中搜索命令时(如果其中一个或两者都在 PATH 中),最后是“”(均表示当前目录)。但请注意,实际的 PATH 环境变量未修改,而是原封不动地传递给 sudo 执行的程序。
这是否意味着“实际的 PATH 环境变量未修改,而是原样传递给 sudo 执行的程序”,将用户的变量PATH
原封不动地传递给执行的命令?sudo
答案1
如果env_reset
启用(默认情况下是这样),sudo
则清除环境,特别是提供它自己的环境PATH
(参见secure_path
参考资料/etc/sudoers
)。如果env_reset
被禁用,env_check
并且env_delete
仍然适用,并且PATH
仍然有可能被清除。您可以通过比较输出来看到这一点
echo $PATH
和
sudo printenv PATH
如果您有自定义的PATH
,您将不会在 的输出中看到它sudo printenv
。
该env
技巧围绕环境清理工作:
sudo env "PATH=$PATH" command
要求sudo
运行env "PATH=$PATH" command
,并由$PATH
您的 shell 扩展以包含当前的PATH
; env
,以 root 身份运行,然后将给定值存储PATH
在其环境中并command
在该环境中运行。
所以PATH
并不特殊,除了在 的上下文中sudo
,具体取决于您的配置。通过适当配置,任何变量都可以以相同的方式变得“特殊” sudo
,PATH
也可以变得“非特殊”。请参阅sudo
和sudoers
详细信息请参阅联机帮助页。