我试图做一个shell脚本,通过MIMEtypes筛选HTTP请求的URL。 (例如:image / jpg图片)
我使用tcpdump来嗅探数据包和grep来过滤http标头。 这是我目前的命令:
echo <password> | sudo -S tcpdump -vvAtp -i en5 tcp port 80 | grep -E GET\|Content-Type:.*image.*
这将过滤http URL和内容types标题。 我想要一些改进,但我不知道如何做到这一点:
不是你正在寻找什么(这将需要一些sed / awk / perl fanciness),但我想你会喜欢这个:
echo <password> | sudo -S tcpdump -vvAtp -i en5 tcp port 80 | grep -oE 'GET.*|Content-Type:.*image.*'
那么,这是第一次尝试。 完全未经testing:
echo <password> | sudo -S tcpdump -vvAtp -i en5 tcp port 80 | grep -oE 'GET|Content-Type:.*image.*' | perl -npe 's/\n/#####/ if /GET/;' | grep -oE '#####[^#][^#]*$'
好吧,这足以让我们另外回答一个问题,特别是因为这次我可以在发布之前进行testing。
这是我的testingstring生成器:
TESTSTRING='GET /foo/bar\nX-Random-Header: true\nContent-Type: text/html\nGET /foo/baz.jpg\nContent-Type: image/jpeg\nGET /index.html\nContent-Type: text/html\nGET /one/two.png\nContent-Type: image/png\nX-Another-Random-Header: 42\nGET /some.gif\nContent-Type: image/gif' /bin/echo -e $TESTSTRING
它产生以下输出:
GET /foo/bar X-Random-Header: true Content-Type: text/html GET /foo/baz.jpg Content-Type: image/jpeg GET /index.html Content-Type: text/html GET /one/two.png Content-Type: image/png X-Another-Random-Header: 42 GET /some.gif Content-Type: image/gif
现在这里是输出的演变:
第一步:过滤掉不包含GET或Content-Type的行,当我们在它的时候,使用“-o”标志过滤出那些行的开始处的任何奇怪。
/bin/echo -e $TESTSTRING | \ grep -oE 'GET.*|Content-Type:.*image.*'
生产:
GET /foo/bar GET /foo/baz.jpg Content-Type: image/jpeg GET /index.html GET /one/two.png Content-Type: image/png GET /some.gif Content-Type: image/gif
第二步:从所有GET行中删除换行符。 这将“堆叠”GET。 由于唯一不是“GET”的行是Content-Type行,这意味着我们每行只有一个Content-Type。
/bin/echo -e $TESTSTRING | \ grep -oE 'GET.*|Content-Type:.*image.*' | \ perl -npe 's/\n/#####/ if /GET/;'
生产:
GET /foo/bar#####GET /foo/baz.jpg#####Content-Type: image/jpeg GET /index.html#####GET /one/two.png#####Content-Type: image/png GET /some.gif#####Content-Type: image/gif
第三步:除去最后一个GET / Content-Type对之外的所有东西。
/bin/echo -e $TESTSTRING | \ grep -oE 'GET.*|Content-Type:.*image.*' | \ perl -npe 's/\n/#####/ if /GET/;' | \ grep -oE '[^#]*#####[^#][^#]*$'
生产:
GET /foo/baz.jpg#####Content-Type: image/jpeg GET /one/two.png#####Content-Type: image/png GET /some.gif#####Content-Type: image/gif
第四步:我们现在可以剥离内容types。
/bin/echo -e $TESTSTRING | \ grep -oE 'GET.*|Content-Type:.*image.*' | \ perl -npe 's/\n/#####/ if /GET/;' | \ grep -oE '[^#]*#####[^#][^#]*$' | \ sed 's/#####.*//; s/GET //;'
生产:
/foo/baz.jpg /one/two.png /some.gif
据我所知,它是你想要的输出。
使用ngrep ,它将grep的原始力量带给networkingstream量。 以下是一些如何使用它的例子 。