Hoe krijg ik de inhoud van een webpagina met Telnet?
Bijvoorbeeld de inhoud van https://stackoverflow.com/questions
.
Antwoord 1, autoriteit 100%
telnet servernaam 80
GET /index.html↵
↵
↵ betekent ‘return’, je moet twee keer op return drukken
Antwoord 2, autoriteit 90%
Je zou kunnen doen
telnet stackoverflow.com 80
En dan plakken
GET /questions HTTP/1.0
Host: stackoverflow.com
# add the 2 empty lines above but not this one
Hier is een transcriptie
$ 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
...
Antwoord 3, autoriteit 80%
Voor het nageslacht, uw vraag was hoe u een http-verzoek naar https://stackoverflow.com/questions
kunt sturen. Het echte antwoord is: dat kan niet met telnet, omdat dit een alleen https-bereikbare url is.
Dus misschien wilt u openssl
gebruiken in plaats van telnet
, zoals dit bijvoorbeeld
$ openssl s_client -connect stackoverflow.com:443
...
---
GET /questions HTTP/1.1
Host: stackoverflow.com
Dit geeft je het https-antwoord.
Antwoord 4, autoriteit 19%
Om wat uit te breiden op eerdere antwoorden, zijn er een paar complicaties.
telnet
is niet bijzonder scriptbaar; misschien gebruik je in plaats daarvan liever nc
(ook wel netcat
genoemd), dat niet-terminale invoer en signalen beter afhandelt.
Ook, in tegenstelling tot telnet
, staat nc
SSL toe (en dus https
in plaats van http
-verkeer — dan heb je poort 443 nodig in plaats van poort 80).
Er is een verschil tussen HTTP 1.0 en 1.1. De recente versie van het protocol vereist dat de kop Host:
in het verzoek wordt opgenomen op een aparte regel na de regel POST
of GET
, en gevolgd door een lege regel om het einde van de verzoekheaders te markeren.
Het HTTP-protocol vereist regeleindes met regelterugloop/regelinvoer. Veel servers zijn hier soepel in, maar sommige niet. Misschien wilt u
printf "%\r\n" \
"GET /questions HTTP/1.1" \
"Host: stackoverflow.com" \
"" |
nc --ssl stackoverflow.com 443
Als je terugvalt op HTTP/1.0 heb je niet altijd de Host:
header nodig, maar veel moderne servers hebben de header toch nodig; als meerdere sites op hetzelfde IP-adres worden gehost, weet de server van GET /foo HTTP/1.0
niet of je http://site1.example.com/foo
of http://site2.example.net/foo
als die twee sites beide op dezelfde server worden gehost (bij afwezigheid van een Host:
-header, een HTTP 1.0-server kan gewoon standaard naar een andere site gaan dan degene die je wilt, dus je krijgt niet de inhoud die je wilde).
Het HTTPS-protocol is in deze details identiek aan HTTP; het enige echte verschil is hoe de sessie aanvankelijk is opgezet.