Alimentación de contenidos de un archivo de texto como comando para telnet

10

Con el comando telnet docs.python.org 80, puedo hacer una solicitud HTTP manual para http://docs.python.org/2/license.html, escribiendo la solicitud real.

Ahora, en lugar de escribirlo en vivo, me gustaría alimentar la solicitud desde un archivo de texto.

Intenté esto:

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


request.txt :

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

(¡Tiene que terminar el archivo con una línea en blanco o recibirá una solicitud incorrecta!)


Pero la conexión al servidor se cierra de inmediato.

¿Cómo debo adecuadamente tubería Request.txt a telnet docs.python.org 80?


editar:

Es bueno saberlo; si usa en HEADlugar de GET, obtendrá la misma respuesta que si hiciera una GETsolicitud, excepto el cuerpo del mensaje.
Por lo tanto, úselo HEADsi solo desea examinar los encabezados HTTP. (es decir, para que el contenido de la respuesta no desordene la salida de su shell).

Bentley4
fuente
¿Podría incluir el comando real que ejecuta manualmente para que podamos comparar? Cuando ejecuto el GETque ha publicado, recibo un 408 Request Time-outerror. Además, ¿ wget http://docs.python.org/2/license.htmlno es una opción?
terdon
Los comandos son correctos. Creo que está haciendo una conexión con el servidor en el momento en que ingresa telnet docs.python.org 80, por lo que tendrá que darse prisa y escribir esas dos líneas (copiar y pegar si es necesario) en unos segundos o el servidor devolverá un error de tiempo de espera.
Bentley4
Estos son los comandos exactos:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4
1
Creo que la razón por la que necesita escribir <ENTER>una segunda vez al final es porque el protocolo HTTP requiere una línea vacía adicional después de los encabezados de solicitud. Consulte la sección de mensaje de solicitud del artículo wiki de HTTP
Bentley4
1
Maldita sea, teóricamente, deberías poder hacerlo, telnet < request.txtpero no puedo hacer que el GETcomando funcione.
terdon

Respuestas:

21

Use netcat (comando nc) en lugar de "telnet", entonces

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

Telnet es un hack rápido y fácil, pero netcat es, aparentemente, la herramienta correcta para el trabajo.

davidgo
fuente
¿Cómo es Telnet 'más rápido' y 'más fácil' que netcap? No veo ninguna diferencia de uso en ese sentido para este caso.
Bentley4
Ciertamente no para este caso, pero creo que las personas (¡léeme, y aparentemente tú!) Tienden a usar telnet porque es lo primero que aprendimos y, por supuesto, está disponible en Windows y Linux, donde creo que netcat no viene preinstalado en Windows.
davidgo
5

Realmente no tengo ninguna experiencia, telnetpero toma la entrada de la redirección de archivos:

telnet < abc.txt

Puedo hacer que se conecte correctamente al servidor de la siguiente manera:

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

Quizás puedas descubrir cómo hacer que acepte el GETcomando, pero no pude. Una alternativa es usar 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

Luego puede guardar el script como telnet.exp, hacerlo ejecutable y ejecutarlo:

./telnet.exp > output.html
terdon
fuente
Genial, no sabía expect! Elegí la respuesta de David porque es la mejor solución para este caso. No veo ninguna diferencia de uso entre netcap y telnet para lo que quería lograr. Sin embargo, gracias por el esfuerzo, Terdon, si pudiera votar más tu respuesta, lo haría.
Bentley4
1
@ Bentley4 no hay problema, el uso nces la mejor solución, debe aceptarlo.
terdon
No veo cómo interactes la forma correcta de finalizar ese expectscript.
2rs2ts
@ 2rs2ts Sé muy poco acerca de esperar, puede que tengas razón, pero no puedo decirlo ya que tu comentario no me dijo por qué crees que está mal. Según tengo entendido, interact"le da el control del proceso actual al usuario, de modo que las pulsaciones de teclas se envían al proceso actual y se devuelven stdout y stderr del proceso actual" (eso es de man expect). Entonces, interactes la manera de darle al usuario una forma de usar realmente la conexión telnet.
terdon
Dado que la pregunta original era sobre alimentar el contenido de un archivo en telnetlugar de interactuar con él, creo que debería terminar con close -i $spawn_idalgo así. Entonces el script saldrá. Con interactrealmente no pude salir telneten absoluto, y tuve que cerrar mi terminal. Bastante miserable (aunque puede haber sido parcialmente mi culpa.)
2rs2ts