我正在尝试将python路径值添加到不同的环境,因为我与另一个用户运行的某些脚本需要设置它。
现在,奇怪的是,当我运行sudo -E
时,我env
中的变量会传递给我sudo
的用户 - 除了PYTHONPATH没有。
运行:
TESTVAR=testValue sudo -E bash -c 'echo $TESTVAR'
将打印“testValue”,但是:
PYTHONPATH=testValue sudo -E bash -c 'echo $PYTHONPATH'
不会打印任何内容。
我试图了解特定变量是否有什么特别之处,sudo在将它们传递给不同的环境时会有不同的行为。
非常感谢帮助,谢谢。
答案 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 said,PYTHONPATH
,sudo -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
才能通过。