在我的Python脚本中,我执行一些需要root权限的操作。我还创建并写入文件,我不想由root用户独占,而是由正在运行脚本的用户拥有。在Python中删除某些操作的root权限
通常,我使用sudo
运行我的脚本。有没有办法做到上述?
在我的Python脚本中,我执行一些需要root权限的操作。我还创建并写入文件,我不想由root用户独占,而是由正在运行脚本的用户拥有。在Python中删除某些操作的root权限
通常,我使用sudo
运行我的脚本。有没有办法做到上述?
可以UID的使用os.seteuid()
之间切换。这不同于os.setuid()
中,你可以回去获得root权限,当你需要他们。
例如,运行以下为根:
import os
open('file1', 'wc')
# switch to userid 501
os.seteuid(501)
open('file2', 'wc')
# switch back to root
os.seteuid(0)
open('file3', 'wc')
这将创建file1
和file3
为根,但file2
与UID 501
如果要确定哪些用户被呼叫用户您的脚本sudo
设置了两个环境变量:
SUDO_USER
SUDO_UID
分别用户名称和呼叫sudo
的用户的uid。所以,你可以使用int(os.environ['SUDO_UID'])
与os.seteuid()
使用。
http://linux.die.net/man/8/sudo报价:
的真实和有效的UID和GID设置为匹配目标用户的
所以,你只需要知道使用哪个用户的选择是,无论是从配置读取目标用户文件或cmdline选项,或某种方式的启发式猜测。
一个好主意就是所谓的权利流失:从root权限开始,然后执行你为他们定义的权限。然后成为一个权限较低的用户。
你会使用os模块为: http://docs.python.org/2/library/os.html#os.setuid
我发现使用os.seteuid和os.setegid并没有真正删除root权限。在给他们打电话之后,我仍然可以做需要root权限的事情。我找到了解决方案,它的工作是使用os.setresuid,而是os.setresgid:
sudo_uid = int(os.getenv("SUDO_UID"))
sudo_gid = int(os.getenv("SUDO_GID"))
# drop root privileges
os.setresgid(sudo_gid, sudo_gid, -1)
os.setresuid(sudo_uid, sudo_uid, -1)
subprocess.call("mkdir /foo1", shell = True) # should fail
# regain root privileges
os.setresgid(0, 0, -1)
os.setresuid(0, 0, -1)
subprocess.call("mkdir /foo2", shell = True) # should succeed
如果你使用'sudo'运行,你可以随时'后您chown'到'__FILE__'的所有者大功告成 – slezica
@uʍopǝpısdn是的......但这样做这样的事情很快就变得活泼,如果你不小心。 – thejh
我没有明白,对不起。创建所有文件的根源('sudo'的后果)。我如何检索运行脚本的用户的用户ID? –