运行时sudo
,我尝试保留与 Borg 备份程序相关的所有环境变量,但有 2 个例外。
env_keep
在我的 sudoers 配置中使用(env_reset
启用),这是我到目前为止所拥有的:
Defaults env_keep += "BORG_*"
Defaults env_keep -= "BORG_CACHE_DIR BORG_SECURITY_DIR"
这导致所有BORG_*
变量都被保留(例如 BORG_REPO),但是我尝试排除的变量也被保留(BORG_CACHE_DIR 和 BORG_SECURITY_DIR)。谁能告诉我为什么这不起作用,以及如何实现我想要做的事情?
更多信息
运行sudo -l
确认规则已被阅读:
Matching Defaults entries for ...:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
passwd_timeout=2, env_keep+="SSH_CLIENT SSH_CONNECTION SSH_TTY SSH_AUTH_SOCK",
env_keep+=BORG_*, env_keep-="BORG_CACHE_DIR BORG_SECURITY_DIR"
然而,sudo -V
以 root 身份运行似乎证实了我对规则设置一些例外的尝试env_keep
尚未被识别sudo
:
...
Reset the environment to a default set of variables
Environment variables to check for safety:
TZ
TERM
...
Environment variables to remove:
*=()*
RUBYOPT
RUBYLIB
... (nothing BORG related) ...
IFS
Environment variables to preserve:
BORG_*
SSH_AUTH_SOCK
SSH_TTY
... (nothing else BORG related) ...
额外的尝试
根据 Steeldriver 在使用操作符的评论中的建议!
,我尝试在 sudoers 中使用这一行而不是上面的:
Defaults env_keep += "BORG_* !BORG_CACHE_DIR !BORG_SECURITY_DIR"
但是,这仍然没有排除我试图从通配符表达式中排除的两个变量。
更简单地使用-=
and+=
运算符(不使用通配符)确实可以按预期工作,如下所示:
Defaults env_keep += "BORG_REPO BORG_LOGGING_CONF BORG_CONFIG_DIR BORG_CACHE_DIR"
Defaults env_keep -= "BORG_CACHE_DIR"
因此,也许这只是 sudoers 中通配符解析方式的限制:在将 扩展为它匹配的完整变量集-=
之前,这些行被视为不相关而被丢弃。*