Envoi du contenu d'un fichier texte en tant que commande à telnet

10

Avec la commande telnet docs.python.org 80, je peux faire une demande HTTP manuelle http://docs.python.org/2/license.htmlen tapant la demande réelle.

Maintenant, au lieu de le taper en direct, j'aimerais alimenter la demande à partir d'un fichier texte.

J'ai essayé ceci:

cat request.txt|telnet docs.python.org 80


request.txt :

GET /2/license.html HTTP/1.1 
Host: docs.python.org

(Vous devez terminer le fichier avec une ligne vierge ou vous obtiendrez une mauvaise demande!)


Mais la connexion au serveur est immédiatement fermée.

Comment dois-je diriger correctement request.txt vers telnet docs.python.org 80?


Éditer:

C'est bon à savoir; si vous utilisez HEADau lieu de GET, vous obtiendrez la même réponse que si vous aviez fait une GETdemande, à l'exception du corps du message.
Donc, utilisez HEADsi vous voulez simplement examiner les en-têtes HTTP. (c'est-à-dire pour que le contenu de la réponse n'encombre pas la sortie de votre shell.)

Bentley4
la source
Pourriez-vous inclure la commande réelle que vous exécutez manuellement afin que nous puissions comparer? Lorsque j'exécute le que GETvous avez publié, j'obtiens une 408 Request Time-outerreur. De plus, n'est-ce wget http://docs.python.org/2/license.htmlpas une option?
terdon
Les commandes sont correctes. Je pense que vous établissez une connexion avec le serveur au moment où vous entrez telnet docs.python.org 80, vous devrez donc vous dépêcher et taper ces deux lignes (copier-coller si nécessaire) en quelques secondes ou le serveur retournera une erreur de temporisation.
Bentley4
Ce sont les commandes exactes:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4
1
Je pense que la raison pour laquelle vous devez taper <ENTER>une deuxième fois à la fin est que le protocole HTTP nécessite une ligne vide supplémentaire après les en-têtes de demande. Voir la section des messages de demande de l' article wiki HTTP
Bentley4
1
Bon sang, théoriquement, vous devriez pouvoir le faire telnet < request.txtmais je ne peux pas faire fonctionner la GETcommande.
terdon

Réponses:

21

Utilisez netcat (commande nc) plutôt que "telnet", donc

cat request.txt | nc docs.python.org 80

Telnet est un hack rapide et facile, mais netcat est, apparemment, l'outil approprié pour le travail.

davidgo
la source
Comment Telnet est-il «plus rapide» et «plus facile» que Netcap? Je ne vois aucune différence d'utilisation à cet égard pour ce cas.
Bentley4
Certainement pas pour ce cas, mais je pense que les gens (lisez-moi, et apparemment vous !!!) ont tendance à utiliser telnet parce que c'est la première chose que nous avons apprise, et, bien sûr, c'est disponible sur Windows et Linux, où je crois que netcat n'est pas préinstallé sous Windows.
davidgo
5

Je n'ai pas vraiment d'expérience, telnetmais cela prend des données de la redirection de fichiers:

telnet < abc.txt

Je peux le faire se connecter correctement au serveur comme suit:

$ cat abc.txt
open docs.python.org 80
$ telnet < abc.txt
telnet> Trying 82.94.164.162...
Connected to dinsdale.python.org.
Escape character is '^]'.
Connection closed by foreign host.

Peut-être que vous pouvez comprendre comment le faire accepter la GETcommande mais je n'ai pas pu. Une alternative est d'utiliser un expectscript:

#!/usr/bin/expect

spawn telnet docs.python.org 80
expect "Escape character is '^]'." { 
     send "GET /2/license.html HTTP/1.1\nHost: docs.python.org\n\n" 
}
interact

Vous pouvez ensuite enregistrer le script sous telnet.exp, le rendre exécutable et l'exécuter:

./telnet.exp > output.html
terdon
la source
Cool, je ne savais pas expect! J'ai choisi la réponse de davidgo car c'est juste la meilleure solution pour ce cas. Je ne vois aucune différence d'utilisation entre netcap et telnet pour ce que je voulais réaliser. Merci pour l'effort néanmoins Terdon, si je pouvais voter davantage votre réponse, je le ferais.
Bentley4
1
@ Bentley4 aucun problème, en utilisant ncest la meilleure solution, vous devez l' accepter.
terdon
Je ne vois pas comment interactest la bonne façon de terminer ce expectscript.
2rs2ts
@ 2rs2ts Je sais très peu de choses à attendre, vous avez peut-être raison, mais je ne peux pas le dire car votre commentaire ne m'a pas dit pourquoi vous pensez que c'est mal. Ma compréhension est que interact"donne le contrôle du processus en cours à l'utilisateur, de sorte que les frappes soient envoyées au processus en cours, et que les stdout et stderr du processus en cours soient renvoyés" (c'est de man expect). C'est donc interactle moyen de donner à l'utilisateur un moyen d'utiliser réellement la connexion telnet.
terdon
Étant donné que la question d'origine portait sur l'alimentation du contenu d'un fichier telnetplutôt que sur l'interaction avec celui-ci, je pense que vous devriez terminer avec close -i $spawn_idquelque chose comme ça. Ensuite, le script se termine. Avec, interactje n'ai pas pu sortir telnetdu tout et j'ai dû fermer mon terminal. Assez misérable (bien que ce soit peut-être partiellement de ma faute.)
2rs2ts