Создание сценария запроса заголовка HTTP с помощью netcat
Вопрос
Я пытаюсь поиграть с netcat, чтобы узнать больше о том, как работает HTTP. Я бы хотел написать некоторые из них на bash или Perl, но я наткнулся на камень преткновения на ранних этапах моего тестирования.
Если я запускаю netcat прямо из приглашения и печатаю запрос HEAD, он работает, и я получаю заголовки для веб-сервера, который я проверяю.
Это работает:
[romandas@localhost ~]$ nc 10.1.1.2 80 HEAD / HTTP/1.0 HTTP/1.1 200 OK MIME-Version: 1.0 Server: Edited out Content-length: 0 Cache-Control: public Expires: Sat, 01 Jan 2050 18:00:00 GMT [romandas@localhost ~]$
Но когда я помещаю ту же информацию в текстовый файл и передаю ее в netcat через канал или через перенаправление, при подготовке к созданию сценариев, она не возвращает заголовки.
Текстовый файл состоит из запроса HEAD и двух новых строк:
HEAD / HTTP/1.0
Отправка той же информации через echo или printf также не работает.
$ printf "HEAD / HTTP/1.0\r\n"; |nc -n 10.1.1.2 80 $ /bin/echo -ne 'HEAD / HTTP/1.0\n\n' |nc 10.1.1.2 80
Есть идеи, что я делаю не так? Не уверен, что это проблема bash, проблема с эхом или проблема с netcat. Р>
Я проверил трафик через Wireshark, и успешный запрос (набранный вручную) отправляет завершающий символ новой строки во втором пакете, тогда как методы echo, printf и text сохраняют символ новой строки в том же пакете, но я не уверен, что вызывает такое поведение.
Решение
Вам нужно два лота \ r \ n " и также сказать netcat, чтобы он ждал ответа. printf & HEAD / HTTP / 1.0 \ r \ n \ r \ n " | nc -n -i 1 10.1.1.2 80
или подобное должно работать.
Другие советы
Другой способ - использовать так называемое соглашение «heredoc».
$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF
Другой способ заставить nc ждать ответа, это добавить режим ожидания для входа. например.
(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80
Вы можете использовать приведенную ниже команду netcat для создания своего экземпляра веб-сервера:
MYIP=$(ifconfig eth0|grep 'inet addr'|awk -F: '{print $2}'| awk '{print $1}')
while true; do echo -e "HTTP/1.0 200 OK\r\n\r\nWelcome to $MYIP" | sudo nc -l -p 80 ; done&
Эта строка также будет работать как эквивалент:
echo -e "HEAD / HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80