Я пытаюсь создать сценарий оболочки, который фильтрует 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. Вот некоторые примеры, как это использовать.