繁体   English   中英

如何使用 subprocess.Popen 以 root 权限打开进程

[英]how to open process with root privileges using subprocess.Popen

我在 python 脚本中打开了一些子进程,我需要其中一个具有 root 权限。

有没有办法在不以 root 权限运行整个脚本的情况下做到这一点?

p1 = "../p1"
p2 = "../p2"
p_root = "../p_root"

proc_P1 = subprocess.Popen(p1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
proc_P2 = subprocess.Popen(p2, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
proc_ROOT = subprocess.Popen(p_root, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

我能想到两种 (*) 方法。

/etc/sudoers.d

添加一个脚本, ../p_root调用,使其成为sudoers.d目录中的无密码 sudo 配置。 此配置将允许使用无密码 sudo 调用../p_root 您必须锁定脚本写入权限。 至少删除其他人写chmod ow../p_root的权限。 否则,有人可以利用此漏洞并通过编辑文件并添加自己的内容以root身份运行任意代码。

/etc/sudoers.d中的每个文件都包含sudo的规则。 您可以在该目录中添加自己的文件,以合理地管理您的系统。 /etc/sudoers.d中的文件按顺序读取(约定将它们命名为10-something20-else等)。 它们必须使用visudo进行编辑。

visudo /etc/sudoers.d/20-special-proot

示例内容(使用的可执行文件的完整路径是强制性的)

youruser    ALL=(ALL)   NOPASSWD:   /usr/bin/bash /full/path/to/p_root

有关sudo的更多详细信息

设置UID

二是设置SetUID。 这是一个文件权限,允许在拥有所有者权限的情况下执行脚本。 即,这意味着您拥有root../p_root脚本,并且可以执行它的任何人(组/其他人)将始终以root身份运行该脚本。

chown root.yourgroup 
chmod u+s ../p_root
chmod o-w ../p_root

同样,同样的安全含义也适用于此。 谁可以执行这个文件(特别是组或其他人具有执行权限)将以root身份运行其中的所有内容。 如果低权限用户(例如其他用户)具有写入权限,那么他们可以简单地编辑文件,将自己添加到root并将您的PS1更改为黑底黑字。

更多细节

须藤 (*)

根据 lior.i 的建议,我也添加了这个选项。
您可以将sudobash作为执行命令添加到脚本路径的前缀,以实现相同的目标。

Popen(['sudo', 'bash', '/path/to/script'])

Popen 值得学习和推荐的执行子流程的方式,尤其是从长远来看。 换句话说,它可以做任何 rest 可以做的事情。 我发现其中一个原因是灵活性和调试。 灵活地将子进程与其父进程完全分离。 默认情况下,如果父母被优雅地杀死(SIGINT/Ctrl+C),孩子也会被发出死亡信号。 同样,它们也附加在它们的stdinstdoutstderr文件描述符上。 也许你想利用一个新的文件描述符来做一些狡猾的魔法。

如果您使用它,您应该考虑的是不在生产中使用它。 让应用程序用户使用无密码 sudo 是一种安全风险,类似于仅以 root 身份运行所有内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM