我正在用python (platform is linux)编写一个工具,任务之一是捕获一个活动的tcp流,并将一个函数应用到每一行。目前我正在使用
import subprocess
proc = subprocess.Popen(['sudo','tcpflow', '-C', '-i', interface, '-p', 'src', 'host', ip],stdout=subprocess.PIPE)
for line in iter(proc.stdout.readline,''):
do_something(line)这很好(在/etc/sudoers中有适当的条目),但我想避免调用外部程序。
到目前为止,我已经研究了下列可能性:
在深入研究这些库之前,我想知道某个人是否有工作代码片段(这似乎是一个相当常见的问题)。如果有人能给我正确的建议,我也很感激。
谢谢
发布于 2012-01-06 03:10:35
Jon领导了维护pynids的工作,这是最新的:http://jon.oberheide.org/pynids/。
因此,这可能允许您进一步探索flowgrep。Pynids本身处理流重构,而不是elegantly.See http://monkey.org/~jose/presentations/pysniff04.d/,这是一些很好的例子。
发布于 2013-02-20 09:41:00
作为后续:我放弃了监视tcp层上的流的想法。相反,我用python编写了一个代理,并让我想要监视的连接( http会话)通过这个代理进行连接。结果更稳定,运行时不需要根权限。此解决方案依赖于吡咯。
这将进入一个独立的程序,例如helper_proxy.py。
from multiprocessing.connection import Listener
import StringIO
from httplib import HTTPResponse
import threading
import time
from miproxy.proxy import RequestInterceptorPlugin, ResponseInterceptorPlugin, AsyncMitmProxy
class FakeSocket(StringIO.StringIO):
def makefile(self, *args, **kw):
return self
class Interceptor(RequestInterceptorPlugin, ResponseInterceptorPlugin):
conn = None
def do_request(self, data):
# do whatever you need to sent data here, I'm only interested in responses
return data
def do_response(self, data):
if Interceptor.conn: # if the listener is connected, send the response to it
response = HTTPResponse(FakeSocket(data))
response.begin()
Interceptor.conn.send(response.read())
return data
def main():
proxy = AsyncMitmProxy()
proxy.register_interceptor(Interceptor)
ProxyThread = threading.Thread(target=proxy.serve_forever)
ProxyThread.daemon=True
ProxyThread.start()
print "Proxy started."
address = ('localhost', 6000) # family is deduced to be 'AF_INET'
listener = Listener(address, authkey='some_secret_password')
while True:
Interceptor.conn = listener.accept()
print "Accepted Connection from", listener.last_accepted
try:
Interceptor.conn.recv()
except: time.sleep(1)
finally:
Interceptor.conn.close()
if __name__ == '__main__':
main()从python helper_proxy.py开始。这将创建一个代理,侦听端口8080上的http连接,并侦听端口6000上的另一个python程序。一旦另一个python程序在该端口上连接,助手代理将向其发送所有http回复。通过这种方式,助手代理可以继续运行,保持http连接,并且监听器可以重新启动以进行调试。
下面是侦听器的工作方式,例如listener.py
from multiprocessing.connection import Client
def main():
address = ('localhost', 6000)
conn = Client(address, authkey='some_secret_password')
while True:
print conn.recv()
if __name__ == '__main__':
main()这只会打印所有的回复。现在,将浏览器指向运行在端口8080上的代理,并建立要监视的http连接。
https://stackoverflow.com/questions/8750434
复制相似问题