如何以root身份执行os.*方法?

3 投票
5 回答
12436 浏览
提问于 2025-04-15 15:27

有没有办法在不把根用户密码存储在我的脚本内存里的情况下,运行一些需要根权限的os.*命令呢?

我的脚本做了以下几件事:

  1. 扫描一些文件夹和文件,检查是否能完成任务
  2. 对/etc/...做一些修改
  3. 创建一个文件夹和一些文件,这些文件夹和文件应该归运行脚本的用户所有

第一步可以作为普通用户完成。第二步我可以通过sudo来运行脚本,但这样的话,第三步创建的文件夹和文件就会归根用户所有。

问题在于,我使用了很多os.makedirs、os.symlink等命令,这让我无法让普通用户运行这个脚本。

感谢大家的建议

目前的解决方案是:

# do all in sudo
os.chown(folder, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))

感谢gnibbler的提示。

5 个回答

2

也许你可以把(2)放在一个单独的脚本里,比如叫做 script2.py,然后在主脚本中用 popen 来调用 sudo script2.py

这样的话,只有(2)这部分会以管理员权限执行。

2

这是一个名为 yourscript.py 的文件:

run_part_1()
subprocess.call(['sudo', sys.executable, 'part2.py'])
run_part_3()

这是另一个名为 part2.py 的文件:

run_part_2()
1

gnibbler 提到了 os.chown 这个函数。接下来的问题是要知道使用 sudo 的用户的 ID。这些信息存储在环境变量 SUDO_* 中:

os.chown, (some_path, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))

把代码分成三个文件可能是个解决办法,但因为代码已经混在一起了,所以这样做不太合适。

撰写回答