加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 更改为其他用户时设置环境

发布时间:2020-12-20 13:20:55 所属栏目:Python 来源:网络整理
导读:我有一个以root(cron)身份运行的bash备份脚本,它将某些任务委托给不同用户拥有的其他特定bash脚本. (简单的例子,原则是,有些事情必须以root身份完成,不同的任务被委托给具有适当环境的用户(oracle,amazon,…) mkdir -p /tmp/backup$NAMEsu - oracle -c "~/.b
我有一个以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,并设置该用户的所有环境变量.
如何为我的python脚本改进这个?我可以遵循标准配方吗?我在想环境变量,umask,……

如果这可能很重要,那么环境就是Solaris.

解决方法

all environment variables of that user are set

通常是因为shell在启动时运行.profile文件.

你有几个选择.

>使用subprocess.Popen创建一个正确的子进程来执行shell .profile – 与su – 相同.
>仔细找到环境变量设置并在Python中模仿它们.问题是.profile可以做各种疯狂的事情,这使得确定.profile的确切效果成为一个潜在的问题.
>或者,您可以提取相关的环境变量,以使shell环境和Python程序都可以访问.

第一.阅读每个用户的.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

这对我来说似乎最好. (因为我们是这样做的.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读