我正在尝试编写一个 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
据我了解,这是您想要的输出。