【发布时间】:2014-02-10 01:13:44
【问题描述】:
您好,我在 python 2.6 中有以下代码:
command = "tcpflow -c -i any port 5559"
port_sniffer = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=1, shell=True)
while True:
line = port_sniffer.stdout.readline()
#do some stuff with line
此代码的目的是嗅探在端口 5559 上通信的两个进程(A 和 B)之间的流量。
现在让我描述一下我遇到的不同情况:
1) 上面的代码没有运行:
A 和 B 正在通信,我可以使用日志清楚地看到它,并且 linux 命令netstat -napl | grep 5559 显示进程正在所需的端口上进行通信。
2) 上面的代码没有运行,我通过直接从 shell 运行 tcpflow -c -i any port 5559 来嗅探:
我可以清楚地看到控制台上的通信:-)。
3) 上面的代码正在运行:进程无法通信。 netstat -napl | grep 5559 不打印任何内容并且日志给出错误!!!
4) 上面的代码在调试模式下运行:我似乎无法在line = port_sniffer.stdout.readline() 行之后执行步骤
我尝试使用迭代器而不是 while 循环(这并不重要,但我仍然指出它)。我还尝试了不同的 bufsize 值(无、1 和 8)。
请帮忙!!
【问题讨论】:
-
tcpflow 不是标准程序。你能提供关于
tcpflow -c -i any port 5559做什么的背景吗?它只是将数据转储到文件中,还是将信息输出到 stdout/stderr? -
哦,还有 FWIW stackoverflow.com/questions/3172470/…
-
tcpflow 捕获 tcp 数据包并将其消息正文(没有 tcp 开销)写入文件或控制台。 -c 标志使它的输出写入控制台。我宁愿使用 shell=True ,因为我不知道还有什么环境可以运行这个程序。
-
问题实际上不在这段代码中。我写的代码有效
标签: python linux subprocess pipe popen