如何通过MIMEtypes过滤HTTP请求URL?

我试图做一个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标题。 我想要一些改进,但我不知道如何做到这一点:

  • 仅当Content-Type是图像时打印URL。
  • GET之前没有换行符,所以在GET之前添加了脏字符。 我想删除这些字符。 如果可能的话,包括“GET”或“HTTP 1.1”本身。

不是你正在寻找什么(这将需要一些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量。 以下是一些如何使用它的例子 。