Alimentazione dei contenuti di un file di testo come comando a telnet


10

Con il comando telnet docs.python.org 80, posso fare una richiesta HTTP manuale http://docs.python.org/2/license.htmldigitando la richiesta effettiva.

Ora, invece di digitarlo dal vivo, mi piacerebbe alimentare la richiesta da un file di testo.

Ho provato questo:

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


request.txt :

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

(Devi finire il file con una riga vuota o otterrai una cattiva richiesta!)


Ma la connessione al server viene chiusa immediatamente.

Come devo correttamente pipe request.txt a telnet docs.python.org 80?


modificare:

Buono a sapersi; se si utilizza HEADinvece di GET, si otterrà la stessa risposta di una GETrichiesta, ad eccezione del corpo del messaggio.
Quindi, usa HEADse vuoi solo esaminare le intestazioni HTTP. (vale a dire in modo che il contenuto della risposta non ingombra l'output della shell.)


Potresti includere il comando effettivo che esegui manualmente in modo che possiamo confrontare? Quando eseguo il messaggio GETpubblicato, viene visualizzato un 408 Request Time-outerrore. Inoltre, wget http://docs.python.org/2/license.htmlnon è un'opzione?
terdon,

I comandi sono corretti Penso che tu stia effettuando una connessione con il server nel momento in cui entri telnet docs.python.org 80, quindi dovrai affrettarti e digitare quelle due righe (copia incolla se necessario) entro pochi secondi o il server restituirà un errore di timeout.
Bentley4

Questi sono i comandi esatti:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4

1
Penso che il motivo per cui è necessario digitare <ENTER>una seconda volta alla fine sia perché il protocollo HTTP richiede una riga vuota aggiuntiva dopo le intestazioni della richiesta. Vedi la sezione del messaggio di richiesta dell'articolo wiki HTTP
Bentley4

1
Accidenti, teoricamente, dovresti essere in grado di farlo, telnet < request.txtma non riesco a far funzionare il GETcomando.
terdon,

Risposte:


21

Utilizzare netcat (comando nc) anziché "telnet", quindi

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

Telnet è un trucco rapido e semplice, ma apparentemente netcat è lo strumento giusto per il lavoro.


In che modo Telnet è "più veloce" e "più semplice" di netcap? Non vedo alcuna differenza di utilizzo al riguardo per questo caso.
Bentley4

Certamente non per questo caso, ma penso che le persone (leggimi, e apparentemente tu !!!) tendano ad usare telnet perché è la prima cosa che abbiamo imparato e, ovviamente, è disponibile su Windows e Linux, dove credo netcat non viene preinstallato su Windows.
davidgo,

5

Non ho alcuna esperienza con telnetma richiede input dal reindirizzamento dei file:

telnet < abc.txt

Posso farlo connettere correttamente al server come segue:

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

Forse puoi capire come farlo accettare il GETcomando, ma non ci sono riuscito. Un'alternativa è usare uno 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

È quindi possibile salvare lo script come telnet.exp, renderlo eseguibile ed eseguirlo:

./telnet.exp > output.html

Fantastico, non lo sapevo expect! Ho scelto la risposta di David perché è la soluzione migliore per questo caso. Non vedo alcuna differenza di utilizzo tra netcap e telnet per ciò che volevo ottenere. Grazie per l'impegno, Terdon, se potessi votare di più la tua risposta, lo farei.
Bentley4,

1
@ Bentley4 nessun problema, usando ncè la soluzione migliore, dovresti accettarlo.
terdon,

Non riesco a vedere come interactsia il modo giusto di terminare quella expectsceneggiatura.
2:00 e

@ 2rs2ts So molto poco di quanto mi aspetto, potresti avere ragione, ma non posso dirlo dal momento che il tuo commento non mi ha detto perché pensi che sia sbagliato. La mia comprensione è che interact"dà il controllo del processo corrente all'utente, in modo che i tasti vengano inviati al processo corrente e vengano restituiti lo stdout e lo stderr del processo corrente" (da qui man expect). Quindi, interactè il modo di dare all'utente un modo di utilizzare effettivamente la connessione telnet.
terdon,

Dal momento che la domanda originale era di inserire il contenuto di un file telnetanziché interagire con esso, penso che dovresti finire con close -i $spawn_idqualcosa del genere. Quindi lo script verrà chiuso. In interactrealtà non sono stato in grado di uscire telnetaffatto e ho dovuto chiudere il mio terminale. Piuttosto miserabile (anche se potrebbe essere stato in parte colpa mia.)
ore 2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.