gpt4 book ai didi

python - 更改为另一个用户时设置环境

转载 作者:太空宇宙 更新时间:2023-11-03 11:57:25 25 4
gpt4 key购买 nike

我有一个以 root (cron) 身份运行的 bash 备份脚本,它将某些任务委托(delegate)给不同用户拥有的其他特定 bash 脚本。 (简单的例子,原则是,有些事情必须以root身份完成,不同的任务委托(delegate)给具有适当环境(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 中模仿这种行为时,我想到了以下内容(以 root 身份从 cron 启动)

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启动时的文件。

您有多种选择。

  1. 使用 subprocess.Popen 创建一个合适的子流程执行 shell .profile -- 与 su - 相同.

  2. 仔细定位环境变量设置并在 Python 中模仿它们。问题是 .profile可以做各种疯狂的事情,这使得确定 .profile 的确切效果成为一个潜在的问题.

  3. 或者您可以提取相关的环境变量,使 shell 环境和您的 Python 程序都可以访问。

首先。阅读 .profile让每个用户清楚它设置的环境变量(不同于别名或其他不适用于您的 Python 脚本的疯狂行为)。其中一些环境变量与您正在运行的脚本相关。有些不相关。

其次。将“相关”环境变量拆分成整洁的 env_backups.sh脚本或 env_uploads.sh脚本。

一旦你有了这些环境变量脚本,更新你的.profilesource env_backup.sh 替换环境变量设置的文件或 source env_uploads.sh .

第三。来源相关env_thisenv_that运行 Python 程序之前的脚本。现在您的 Python 环境与您的 shell 环境共享变量,您只需在一个地方维护它们。

我的脚本.sh

source ~oracle/env_backup.sh
source ~amazon/env_uploads.sh
python my_script.py

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

关于python - 更改为另一个用户时设置环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3529348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com