我读了man sudo
以下内容:
--preserve-env
向安全策略表明用户希望保留其现有的环境变量。如果用户没有保护环境的权限,安全策略可能会返回错误。
但我想知道,即使我没有这个许可,是什么阻止我跑步
sudo env MY_VAR=$MY_VAR <cmd>
?
答案1
有趣的问题。首先,手动设置环境很乏味,所以--preserve-env
显然更好。
对于安全方面: sudo 配置可以禁止您env
使用 sudo 执行,或者更好地只允许运行不包含env
.
我认为 sudoer 配置不限于完全 root 访问的有限命令列表。这不仅仅是env
。为什么不做呢sudo bash -c 'export MY_VAR="$MY_VAR"; exec <cmd>'
。这与您不应逃脱的受限 shell 类似。如果您不严格限制可以运行的内容,则可能存在逃生路线。
我认为 sudoer 手册页的这一部分支持这一点:
SETENV 和 NOSETENV
这些标签根据每个命令覆盖 setenv 选项的值。请注意,如果已为命令设置 SETENV,则用户可以通过 -E 选项从命令行禁用 env_reset 选项。此外,在命令行上设置的环境变量不受
env_check
、env_delete
或施加的限制env_keep
。因此,只有受信任的用户才被允许以这种方式设置变量。如果匹配的命令是 ALL,则该命令隐含 SETENV 标记;使用 NOSETENV 标签可以覆盖此默认值。
因此,如果允许用户使用所有命令,包括env
他/她也可以(默认情况下)使用--preserve-env
.如果配置仅允许特定命令,则默认为 NOSETENV,因此用户既不能--preserve-env
也不能调用env
来绕过它。
TL;DR:您不太可能缺乏使用权限--preserve-env
但能够使用env
.