如何通过 mime 类型过滤 http 请求 URL?

如何通过 mime 类型过滤 http 请求 URL?

我正在尝试编写一个 shell 脚本,通过 mime 类型过滤 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 和 content-type 标头。我想要一些改进,但我不知道如何做到这些:

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

答案1

不完全是你要找的(这需要一些 sed/awk/perl 的功能),但我想你会喜欢这个:

echo <password> | sudo -S tcpdump -vvAtp -i en5 tcp port 80 | grep -oE 'GET.*|Content-Type:.*image.*'

好吧,这是第一次尝试。完全未经测试:

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 '#####[^#][^#]*$' 

答案2

好的,这足以证明另一个答案的正确性,特别是因为这一次,我可以在发布之前真正地测试它。

这是我的测试字符串生成器:

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

第四步:我们现在可以去掉 Content-Type。

/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

据我了解,这是您想要的输出。

答案3

使用ngrep,它将 grep 的原始功能带入网络流量。以下是一些如何使用它的示例

相关内容