![](/img/trans.png)
[英]How to end the sub process when using subprocess.Popen with python?
[英]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)
我能想到两种 (*) 方法。
添加一个脚本, ../p_root
调用,使其成为sudoers.d
目录中的无密码 sudo 配置。 此配置将仅允许使用无密码 sudo 调用../p_root
。 您必须锁定脚本写入权限。 至少删除其他人写chmod ow../p_root
的权限。 否则,有人可以利用此漏洞并通过编辑文件并添加自己的内容以root
身份运行任意代码。
/etc/sudoers.d
中的每个文件都包含sudo
的规则。 您可以在该目录中添加自己的文件,以合理地管理您的系统。 /etc/sudoers.d
中的文件按顺序读取(约定将它们命名为10-something
、 20-else
等)。 它们必须使用visudo
进行编辑。
visudo /etc/sudoers.d/20-special-proot
示例内容(使用的可执行文件的完整路径是强制性的)
youruser ALL=(ALL) NOPASSWD: /usr/bin/bash /full/path/to/p_root
二是设置SetUID。 这是一个文件权限,允许在拥有所有者权限的情况下执行脚本。 即,这意味着您拥有root
的../p_root
脚本,并且可以执行它的任何人(组/其他人)将始终以root
身份运行该脚本。
chown root.yourgroup
chmod u+s ../p_root
chmod o-w ../p_root
同样,同样的安全含义也适用于此。 谁可以执行这个文件(特别是组或其他人具有执行权限)将以root
身份运行其中的所有内容。 如果低权限用户(例如其他用户)具有写入权限,那么他们可以简单地编辑文件,将自己添加到root
并将您的PS1
更改为黑底黑字。
根据 lior.i 的建议,我也添加了这个选项。
您可以将sudo
和bash
作为执行命令添加到脚本路径的前缀,以实现相同的目标。
Popen(['sudo', 'bash', '/path/to/script'])
Popen 值得学习和推荐的执行子流程的方式,尤其是从长远来看。 换句话说,它可以做任何 rest 可以做的事情。 我发现其中一个原因是灵活性和调试。 灵活地将子进程与其父进程完全分离。 默认情况下,如果父母被优雅地杀死(SIGINT/Ctrl+C),孩子也会被发出死亡信号。 同样,它们也附加在它们的stdin
、 stdout
和stderr
文件描述符上。 也许你想利用一个新的文件描述符来做一些狡猾的魔法。
如果您使用它,您应该考虑的是不在生产中使用它。 让应用程序用户使用无密码 sudo 是一种安全风险,类似于仅以 root 身份运行所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.