sudo -E没有通过PYTHONPATH

时间:2016-03-06 08:38:09

标签: python linux bash sudo

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

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

运行:

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

将打印“testValue”,但是:

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

不会打印任何内容。

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

非常感谢帮助,谢谢。

3 个答案:

答案 0 :(得分:4)

因为PYTHONPATH的{​​bad}变量默认表中有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
};

正如您所见,PYTHONPATH就在那里。

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

答案 1 :(得分:0)

作为heemayl saidPYTHONPATHsudo -E和其他修改程序行为的变量(以及可用于升级权限的变量)将被sudo忽略。

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

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

    env_keep
  • 配置您的sudoers文件的Defaults env_keep += "PYTHONPATH" 变量。例如:

    Defaults

    请注意,此行是//publish subscriptions course view Meteor.publishComposite('adminCourseSubscriptions', function(courseId){ return { //get the subs for the selected course find: function(){ return Subscriptions.find( {course_id: courseId} ); }, children: [ { //get the subscriber details for the course find: function(sub){ return Meteor.users.find({_id:sub.user_id}); } } ] }; }); 的一部分,可能适用于所有sudoers,这可能不是您想要的。

答案 2 :(得分:0)

sudo env "PYTHONPATH=$PYTHONPATH" bash -c 'echo $PYTHONPATH'

您需要env才能通过。