Comment obtenir le contenu d'une page Web en utilisant Telnet? (par exemple https://stackoverflow.com/questions contenu de la page)
telnet NomServeur 80
GET /index.html
Vous pourriez faire
telnet stackoverflow.com 80
Et puis coller
GET /questions HTTP/1.0
Host: stackoverflow.com
# add the 2 empty lines above but not this one
Voici une transcription
$ 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
...
Pour la postérité, votre question était de savoir comment envoyer une demande http à https://stackoverflow.com/questions
. La vraie réponse est: vous ne pouvez pas utiliser telnet, car il s’agit d’une URL accessible uniquement par https.
Donc, vous pouvez utiliser openssl
au lieu de telnet
, comme ceci par exemple
$ openssl s_client -connect stackoverflow.com:443
...
---
GET /questions HTTP/1.1
Host: stackoverflow.com
Cela vous donnera la réponse https.
Pour développer un peu les réponses précédentes, il existe quelques complications.
telnet
n'est pas particulièrement scriptable; vous préférerez peut-être utiliser nc
(ou netcat
), qui gère mieux les entrées non-terminales et les signaux.
De plus, contrairement à telnet
, nc
autorise réellement SSL (et donc https
au lieu du trafic http
- vous avez besoin du port 443 au lieu du port 80).
Il existe une différence entre HTTP 1.0 et 1.1. La version récente du protocole requiert que l'en-tête Host:
soit inclus dans la requête sur une ligne séparée après la ligne POST
ou GET
, et qu'il soit suivi d'une ligne vide pour marquer la fin des en-têtes de la requête.
Le protocole HTTP nécessite des extrémités de ligne retour à la ligne/retour à la ligne. Beaucoup de serveurs sont indulgents à ce sujet, mais certains ne le sont pas. Vous voudrez peut-être utiliser
printf "%\r\n" \
"GET /questions HTTP/1.1" \
"Host: stackoverflow.com" \
"" |
nc --ssl stackoverflow.com 443
Si vous utilisez HTTP/1.0, vous n'avez pas toujours besoin de l'en-tête Host:
, mais de nombreux serveurs modernes exigent quand même l'en-tête. Si plusieurs sites sont hébergés sur la même adresse IP, le serveur ne sait pas à partir de GET /foo HTTP/1.0
si vous voulez dire http://site1.example.com/foo
ou http://site2.example.net/foo
si ces deux sites sont tous deux hébergés sur le même serveur (en l'absence d'un en-tête Host:
, un serveur HTTP 1.0 peut par défaut sur un site différent de celui que vous souhaitez, pour ne pas obtenir le contenu souhaité).
Le protocole HTTPS est identique à HTTP dans ces détails; la seule différence réelle réside dans la configuration initiale de la session.