sudo -E 不通过 PYTHONPATH

aav*_*ram 6 python linux bash sudo

我正在尝试将 python 路径值添加到不同的环境,因为我与另一个用户一起运行的某些脚本需要设置它。

现在,奇怪的是,当我运行时sudo -E,我的envdo 中的变量会传递给我要访问的用户sudo- 除了 PYTHONPATH 没有。

跑步:

TESTVAR=testValue sudo -E bash -c 'echo $TESTVAR'
Run Code Online (Sandbox Code Playgroud)

将打印“testValue”,但是:

PYTHONPATH=testValue sudo -E bash -c 'echo $PYTHONPATH'
Run Code Online (Sandbox Code Playgroud)

不会打印任何东西。

我试图了解特定变量是否有什么特别之处,当将它们传递到不同的环境时,sudo 的行为会有所不同。

帮助将不胜感激,谢谢。

hee*_*ayl 6

因为PYTHONPATH在 的sudo“坏”变量的默认表中要从环境中删除(如果没有明确保留env_keep)。

从源代码plugins/sudoers/env.c文件sudo

/*
 * Default table of "bad" variables to remove from the environment.
 * XXX - how to omit TERMCAP if it starts with '/'?
 */
static const char *initial_badenv_table[] = {
    "IFS",
    .
    . (Truncated)
    .
    "PYTHONHOME",               /* python, module search path */
    "PYTHONPATH",               /* python, search path */
    "PYTHONINSPECT",            /* python, allow inspection */
    "PYTHONUSERBASE",           /* python, per user site-packages directory */
    "RUBYLIB",                  /* ruby, library load path */
    "RUBYOPT",                  /* ruby, extra command line options */
    NULL
};
Run Code Online (Sandbox Code Playgroud)

如您所见PYTHONPATH,就在那里。

在运行时实现此功能的已编译二进制文件是/usr/lib/sudo/sudoers.so.