Как получить контент веб-страницы с помощью Telnet?
Например, содержание https://stackoverflow.com/questions
.
Как получить контент веб-страницы с помощью Telnet?
Например, содержание https://stackoverflow.com/questions
.
telnet ServerName 80
GET /index.html↵
↵
↵ означает "возврат", вам нужно дважды нажать "вернуться"
Вы могли бы сделать
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
...
Для потомков ваш вопрос заключался в том, как отправить 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.
Чтобы несколько расширить предыдущие ответы, есть несколько сложностей.
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 в этих деталях; единственная реальная разница заключается в том, как сессия настроена изначально.