Назад | Перейти на главную страницу

Как отфильтровать URL-адрес HTTP-запроса по типу MIME?

Я пытаюсь создать сценарий оболочки, который фильтрует URL-адрес HTTP-запроса по типу mime. (например, изображение / изображение в формате jpg)

Я использовал tcpdump для прослушивания пакетов и grep для фильтрации заголовков http. Это моя текущая команда:

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

Это фильтрует URL-адрес http и заголовок типа содержимого. Я хочу некоторых улучшений, но не могу понять, как это сделать:

Не совсем то, что вы ищете (что потребовало бы некоторой фантазии 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 '#####[^#][^#]*$' 

Хорошо, этого достаточно, чтобы получить еще один ответ, тем более, что на этот раз я мог бы действительно протестировать его перед публикацией.

Вот мой генератор тестовой строки:

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

Как я понимаю, это ваш желаемый результат.

Использовать нгреп, он привносит в сетевой трафик всю мощь grep. Вот некоторые примеры, как это использовать.