如何以root身份执行os.*方法?
有没有办法在不把根用户密码存储在我的脚本内存里的情况下,运行一些需要根权限的os.*命令呢?
我的脚本做了以下几件事:
- 扫描一些文件夹和文件,检查是否能完成任务
- 对/etc/...做一些修改
- 创建一个文件夹和一些文件,这些文件夹和文件应该归运行脚本的用户所有
第一步可以作为普通用户完成。第二步我可以通过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')))
把代码分成三个文件可能是个解决办法,但因为代码已经混在一起了,所以这样做不太合适。