python – 更改为其他用户时设置环境
我有一个以root(cron)身份运行的bash备份脚本,它将某些任务委托给不同用户拥有的其他特定bash脚本. (简单的例子,原则是,有些事情必须以root身份完成,不同的任务被委托给具有适当环境的用户(oracle,amazon,…)
mkdir -p /tmp/backup$NAME su - oracle -c "~/.backups/export-test.sh" tar cf /tmp/backup/$NOW.tar /tmp/backup$NAME su - amazon upload_to_amazon.sh /tmp/backup/$NOW.tar 这个脚本本身就像用户oracle那样执行一些任务: mkdir -p $TMP_LOCATION cd ~/.backups exp $TMP_LOCATION/$NAME-$NOW 当我尝试在python中模仿这种行为时,我想出了以下内容(从cron作为root开始) name = "oracle" # part run as root os.makedirs(tmp_backup + name) os.setegid(pwd.getpwnam(name)[3]) os.seteuid(pwd.getpwnam(name)[2]) # part run as oracle os.makedirs(tmp_location) os.chdir(os.path.expanduser("~{user}/.backups".format(user=name))) subprocess.check_call(["exp","os.path.join(tmp_location,name+'-'+now)" ]) 在bash中使用su – 时,会调用一个真正的新shell,并设置该用户的所有环境变量. 如果这可能很重要,那么环境就是Solaris. 解决方法
通常是因为shell在启动时运行.profile文件. 你有几个选择. >使用subprocess.Popen创建一个正确的子进程来执行shell .profile – 与su – 相同. 第一.阅读每个用户的.profile,以清楚它设置的环境变量(不同于别名或其他不适用于Python脚本的疯狂).其中一些环境变量与您正在运行的脚本相关.有些不相关. 第二.将“相关”环境变量拆分为整洁的env_backups.sh脚本或env_uploads.sh脚本. 获得这些环境变量脚本后,请更新.profile文件,以使用source env_backup.sh或source env_uploads.sh替换环境变量设置. 第三.在运行Python程序之前,请获取相关的env_this和env_that脚本.现在,您的Python环境与shell环境共享变量,您只能将它们保存在一个位置. my_script.sh source ~oracle/env_backup.sh source ~amazon/env_uploads.sh python my_script.py 这对我来说似乎最好. (因为我们是这样做的.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |