Подтвердить что ты не робот

Как отправить HTTP-запрос с помощью Telnet

Как получить контент веб-страницы с помощью Telnet?

Например, содержание https://stackoverflow.com/questions.

4b9b3361

Ответ 1

telnet ServerName 80


GET /index.html↵
↵

↵ означает "возврат", вам нужно дважды нажать "вернуться"

Ответ 2

Вы могли бы сделать

telnet stackoverflow.com 80

И затем вставьте

GET /questions HTTP/1.0
Host: stackoverflow.com


# add the 2 empty lines above but not this one

Вот транскрипция

$ telnet stackoverflow.com 80
Trying 151.101.65.69...
Connected to stackoverflow.com.
Escape character is '^]'.
GET /questions HTTP/1.0
Host: stackoverflow.com

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
...

Ответ 3

Для потомков ваш вопрос заключался в том, как отправить http-запрос на https://stackoverflow.com/questions. Реальный ответ: вы не можете с telnet, потому что это https-доступный URL-адрес.

Итак, вы можете использовать openssl вместо telnet, как это, например,

$ openssl s_client -connect stackoverflow.com:443
...
---
GET /questions HTTP/1.1
Host: stackoverflow.com

Это даст вам ответ https.

Ответ 4

Чтобы несколько расширить предыдущие ответы, есть несколько сложностей.

telnet не особенно подходит для сценариев; вместо этого вы можете предпочесть использовать nc (он же netcat), который лучше обрабатывает нетерминальный ввод и передает сигналы.

Кроме того, в отличие от telnet, nc фактически разрешает SSL (и поэтому https вместо трафика http - тогда вам нужен порт 443 вместо порта 80).

Есть разница между HTTP 1.0 и 1.1. Последняя версия протокола требует, чтобы заголовок Host: был включен в запрос в отдельной строке после строки POST или GET, а за ним должна следовать пустая строка, чтобы отметить конец заголовков запроса.

Протокол HTTP требует возврата каретки/перевода строки. Многие серверы снисходительны к этому, но некоторые нет. Вы можете использовать

printf "%\r\n" \
    "GET /questions HTTP/1.1" \
    "Host: stackoverflow.com" \
    "" |
nc --ssl stackoverflow.com 443

Если вы вернетесь к HTTP/1.0, вам не всегда нужен заголовок Host: но многие современные серверы все равно требуют заголовок; если несколько сайтов размещены на одном IP-адресе, сервер не знает из GET/foo HTTP/1.0, имеете ли вы в виду http://site1.example.com/foo или http://site2.example.net/foo если оба этих сайта размещены на одном и том же сервере (при отсутствии заголовка Host: сервер HTTP 1.0 может просто по умолчанию использовать сайт, отличный от того, который вам нужен, поэтому вы не получите нужное содержимое).

Протокол HTTPS идентичен HTTP в этих деталях; единственная реальная разница заключается в том, как сессия настроена изначально.