84 votes

Comment envoyer une requête HTTP à l'aide de Telnet ?

Comment obtenir le contenu d'une page web à l'aide de Telnet ?

Par exemple, le contenu de https://stackoverflow.com/questions .

103voto

stefan bachert Points 4698

Vous pouvez faire

telnet stackoverflow.com 80

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
...

58voto

ngille Points 776

Telnet NomServeur 80


GET /index.html

signifie "retour", vous devez appuyer deux fois sur "retour".

49voto

dulaccc Points 191

Pour la postérité, votre question était de savoir comment envoyer une requête 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.

Vous pouvez donc utiliser openssl au lieu de telnet comme par exemple

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

Vous obtiendrez ainsi la réponse https.

12voto

tripleee Points 28746

Pour développer quelque peu les réponses précédentes, il y a quelques complications.

telnet n'est pas particulièrement scriptable ; vous préférerez peut-être utiliser nc (alias netcat ), qui gère mieux les entrées et les signaux non terminaux.

En outre, contrairement aux telnet , nc permet en fait d'utiliser SSL (et donc https au lieu de 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 la plus récente du protocole nécessite l'utilisation de l'option Host: à inclure dans la demande sur une ligne séparée après l'en-tête POST o GET et être suivie d'une ligne vide pour marquer la fin des en-têtes de la requête.

Le protocole HTTP exige des fins de ligne de type retour de chariot / saut de ligne. De nombreux serveurs sont indulgents à ce sujet, mais certains ne le sont pas. Vous pouvez utiliser

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

Si vous vous rabattez sur HTTP/1.0, vous n'avez pas toujours besoin de l'option Host: mais de nombreux serveurs modernes l'exigent de toute façon ; si plusieurs sites sont hébergés sur la même adresse IP, le serveur ne sait pas à partir de quelle adresse IP le site est hébergé. GET /foo HTTP/1.0 si vous voulez dire http://site1.example.com/foo o http://site2.example.net/foo si ces deux sites sont hébergés sur le même serveur (en l'absence d'un Host: un serveur HTTP 1.0 peut simplement renvoyer par défaut vers un site différent de celui que vous souhaitez, de sorte que vous n'obtenez pas le contenu que vous pensez obtenir).

Le protocole HTTPS est identique au protocole HTTP sur ces points ; la seule véritable différence réside dans la manière dont la session est établie initialement.

Pour ce que cela vaut, Telnet était autrefois un protocole assez répandu pour l'accès non crypté à un terminal à distance (port standard numéro 23). Lorsque l'accès à distance crypté via SSH (port 22) est devenu disponible en 1995, il a entraîné une extinction massive des serveurs Telnet, mais le logiciel client existe toujours et vous permet de communiquer facilement avec n'importe quel serveur textuel, tel qu'un serveur HTTP (ou un serveur SMTP, ou un serveur FTP, etc.).

Le protocole Telnet comporte certaines séquences de contrôle non textuelles qu'un serveur HTTP ne transmettra évidemment pas la plupart du temps, bien que cela puisse se produire par accident, par exemple si vous le déclenchez pour envoyer des données binaires aléatoires, auquel cas le client pourrait intercepter les codes de contrôle et corrompre les données.

Netcat n'a pas de telles caractéristiques spécifiques au protocole, et est purement un outil pour mettre des octets sur le fil. En plus de sa conception générale plus simple et plus robuste, il possède des fonctionnalités qui vous permettent de contrôler des comportements spécifiques de la socket brute à partir de la ligne de commande, et de contrôler les détails de son comportement interactif pour l'écriture de scripts, etc. Contrairement au client Telnet, il vous permet également de mettre en place une socket d'écoute, donc un simple serveur.

(Sur certaines plates-formes, il existe plusieurs implémentations de Netcat, dont certaines présentent moins de fonctionnalités que d'autres. Si vous ne trouvez pas netcat Il peut s'agir de nc o ncat . Il existe également un outil séparé socat ce qui peut être utile pour le dépannage du réseau).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X