【发布时间】:2021-05-23 23:11:58
【问题描述】:
我需要运行一个可执行文件并将来自 os.pipe 的 fd 传递给它,以便父进程可以从中读取结果。我不想为此使用标准输出,因为我需要在孩子的终端中查看日志消息,所以我正在尝试为此目的实现一个管道。
我不能使用 fork 和 multiprocessing.Process,因为此外,子进程应该通过 sudo 运行,而不是父进程,父进程不应该以 root 权限运行。
不应允许其他进程查看该管道中的内容。
这是ospipeexample.py 和孤立的问题。为简单起见,这个最小示例被压缩到一个包含两个分支的文件中。
#!/usr/bin/python3
import os
import pickle
import sys
if len(sys.argv) == 2:
# write in the child process started via os.system
print('child opening', sys.argv[-1])
w = os.fdopen(int(sys.argv[-1]), 'wb')
w.write(pickle.dumps(1))
w.write(b'\n')
w.flush()
else:
# read in the parent process
rfd, wfd = os.pipe()
print('parent created', rfd, wfd)
r = os.fdopen(rfd, 'rb')
os.system('sudo python3 ospipeexample.py %d' % wfd)
print(pickle.loads(r.readline()))
我运行python3 ospipeexample.py 的输出是(编辑:这已解决,见下文):
parent created 3 4
child opening 4
Traceback (most recent call last):
File "/mnt/data/Code/ospipeexample.py", line 8, in <module>
os.fdopen(int(sys.argv[-1]), 'wb')
File "/usr/lib/python3.9/os.py", line 1023, in fdopen
return io.open(fd, *args, **kwargs)
OSError: [Errno 9] Bad file descriptor
预期输出:
parent created 3 4
child opening 4
1
这是ps -aux --forest的输出
mango 12102 0.2 0.0 14480 9236 pts/2 S+ 15:40 0:00 | \_ python3 ospipeexample.py
root 12103 0.0 0.0 16184 7468 pts/2 S+ 15:40 0:00 | \_ sudo python3 ospipeexample.py 4
root 12104 0.2 0.0 14476 8816 pts/2 S+ 15:40 0:00 | \_ python3 ospipeexample.py 4
有什么替代方法,有没有办法使用 python 设置共享内存或其他东西,并通过 os.system 或 subprocess.Popen 将其传递给子进程?
【问题讨论】:
-
问题的标题是“任何进程都可以读取包含机密内容的我的管道”,但是您在问题中显示的似乎是一个相当相反的问题:即使您的进程也无法读取管道.您是如何得出任何流程都可以的结论的?
-
见下面的答案。因为我可以从给定路径的任何 python 终端读取管道内容,例如
/proc/12709/fd/4 -
是的,这很令人困惑。我想我会为此设置另一个最小示例并缩小问题的范围
-
没有其他进程可以访问它?我必须通过
os.system/subprocess.Popen传递该共享内存的名称,这将使该名称在ps中可见