如何获得Python的子进程模块来接受fd而不是路径(带有=的execveat()AT_EMPTY_PATH
)?例:
subprocess.Popen (["argv0", "argv1"], shell=False,
executable=os.open ("/proc/self/exe",
os.O_RDONLY
| os.O_CLOEXEC))
使用Python 3.6.5时,由于TypeError而失败。
当然,目标是避免在验证二进制文件和对execve(2)的调用之间避免使用TOCTTOU 。
我知道os.execve()也可以与fds一起使用,但是我不希望在此之上重新实现子流程模块。
CPython是POSIX_posixsubprocess
的内部实现subprocess
,不支持fexecve(3)
也不支持execveat(2)
。如果可以假定/proc
已安装,则只需指定/proc/self/fd/N
(其中N是所需的fd)作为可执行文件即可。这也是fexecve(3)
旧内核的原因。有关proc(5)
的详细信息,请参见Linux手册页/proc/self/fd
。
编辑示例:
def spawn_exefd(args, fd, bufsize=-1, *args, **kwargs):
return subprocess.Popen(args, bufsize, "/proc/self/fd/%d" % (fd,), *args, **kwargs)
#import fcntl # py2
import os
fd = os.open("/bin/sh", os.O_RDONLY | os.O_CLOEXEC)
#fcntl.fcntl(fd, fcntl.F_SETFD, fcntl.fcntl(fd, fcntl.F_GETFD) | fcntl.FD_CLOEXEC) # py2
spawn_exefd(["sh", "-i"], fd)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句