【问题标题】:sudo -E does not pass PYTHONPATHsudo -E 不通过 PYTHONPATH
【发布时间】:2016-03-06 08:38:08
【问题描述】:

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

现在,奇怪的是,当我运行 sudo -E 时,我在 env 中的变量确实会传递给我 sudo 的用户,但 PYTHONPATH 不会。

跑步:

TESTVAR=testValue sudo -E bash -c 'echo $TESTVAR'

将打印“testValue”,但是:

PYTHONPATH=testValue sudo -E bash -c 'echo $PYTHONPATH'

不会打印任何东西。

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

非常感谢您的帮助,谢谢。

【问题讨论】:

标签: python linux bash sudo


【解决方案1】:

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

来自sudo源代码的plugins/sudoers/env.c文件:

/*
 * 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
};

如您所见,PYTHONPATH 就在其中。

在运行时实现这个的编译二进制文件是/usr/lib/sudo/sudoers.so

【讨论】:

    【解决方案2】:

    sudo -E 会忽略 heemayl saidPYTHONPATH 和其他修改程序行为(并可用于提升权限)的变量。

    要启用它们,您有两种方法:

    • 将它们作为参数显式传递给sudo,如下所示:

      sudo PYTHONPATH=... command
      
    • 配置您的 sudoers 文件的 env_keep 变量。例如:

      Defaults env_keep += "PYTHONPATH"
      

      请注意,这行是Defaults 的一部分,可能适用于所有 sudoer,这可能不是您想要的。

    【讨论】:

      【解决方案3】:
      sudo env "PYTHONPATH=$PYTHONPATH" bash -c 'echo $PYTHONPATH'
      

      你需要env强制传递。

      【讨论】:

        猜你喜欢
        • 2016-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 2013-07-23
        • 2018-10-30
        相关资源
        最近更新 更多