Сценарий запроса HTTP-заголовка с netcat

Я пытаюсь поиграть с netcat, чтобы узнать больше о том, как работает HTTP. Я бы хотел, чтобы script часть из них в bash или Perl, но я наткнулся на камень преткновения на ранней стадии тестирования.

Если я запускаю netcat прямо из приглашения и набираю запрос HEAD, он работает, и я получаю заголовки для веб-сервера, который я просматриваю.

Это работает:

    [[email protected] ~]$ 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

    [[email protected] ~]$

Но когда я помещаю ту же информацию в текстовый файл и передаю ее 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 и текстовые файлы сохраняют новую строку в одном пакете, но я не что вызывает это поведение.

Ответы

Ответ 1

Вам нужно две партии "\ r\n", а также сообщить netcat ждать ответа. printf "HEAD / HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80 или подобное должно работать.

Ответ 2

Другой способ - использовать так называемое соглашение heredoc.

$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF

Ответ 3

Другой способ заставить nc ждать ответа - добавить сон к входу. например.

(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80

Ответ 4

Вы можете использовать ниже команду 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&

Ответ 5

Эта строка также будет работать как эквивалентная:

echo -e "HEAD / HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80