Alimentando o conteúdo de um arquivo de texto como comando para telnet

10

Com o comando telnet docs.python.org 80, eu posso fazer uma solicitação HTTP manual para http://docs.python.org/2/license.html, digitando a solicitação real.

Agora, em vez de digitá-lo ao vivo, gostaria de alimentar a solicitação de um arquivo de texto.

Eu tentei isso:

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


request.txt :

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

(Você precisa finalizar o arquivo com uma linha em branco ou poderá receber uma solicitação incorreta!)


Mas a conexão com o servidor é fechada imediatamente.

Como devo adequadamente tubulação request.txt para telnet docs.python.org 80?


editar:

É bom saber; se você usar em HEADvez de GET, receberá a mesma resposta como se tivesse feito uma GETsolicitação, exceto o corpo da mensagem.
Portanto, use HEADse você quiser apenas examinar os cabeçalhos HTTP. (ou seja, para que o conteúdo da resposta não atrapalhe a saída do shell.)

Bentley4
fonte
Você poderia incluir o comando real que você executa manualmente para que possamos comparar? Quando executo o que GETvocê postou, recebo um 408 Request Time-outerro. Além disso, wget http://docs.python.org/2/license.htmlnão é uma opção?
terdon
Os comandos estão corretos. Eu acho que você está fazendo uma conexão com o servidor no momento em que entra telnet docs.python.org 80, então você precisa se apressar e digitar essas duas linhas (copiar e colar se necessário) dentro de alguns segundos ou o servidor retornará um erro de tempo limite.
Bentley4
Estes são os comandos exatos:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4 /
1
Eu acho que a razão pela qual você precisa digitar <ENTER>uma segunda vez no final é porque o protocolo HTTP requer uma linha vazia extra após os cabeçalhos da solicitação. Veja a seção de mensagem de solicitação do artigo da wiki HTTP
Bentley4
1
Droga, teoricamente, você deveria ser capaz de fazer isso, telnet < request.txtmas não consigo que o GETcomando funcione.
terdon

Respostas:

21

Use netcat (comando nc) em vez de "telnet", para

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

O Telnet é um hack rápido e fácil, mas o netcat é, aparentemente, a ferramenta correta para o trabalho.

davidgo
fonte
Como o Telnet é 'mais rápido' e 'mais fácil' do que o netcap? Não vejo diferença de uso nesse sentido.
Bentley4
Certamente não neste caso, mas acho que as pessoas (leia-me e aparentemente você !!!) tendem a usar o telnet porque é a primeira coisa que aprendemos e, é claro, está disponível no Windows e Linux, onde acredito que o netcat não vem pré-instalado no Windows.
Davidgo #
5

Eu realmente não tenho nenhuma experiência com, telnetmas é preciso receber informações do redirecionamento de arquivo:

telnet < abc.txt

Posso fazer com que ele se conecte ao servidor corretamente da seguinte maneira:

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

Talvez você possa descobrir como fazê-lo aceitar o GETcomando, mas eu não consegui. Uma alternativa é usar um 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

Você pode salvar o script como telnet.exp, torná-lo executável e executá-lo:

./telnet.exp > output.html
Terdon
fonte
Legal, eu não sabia expect! Eu escolhi a resposta da davidgo porque é apenas a melhor solução para este caso. Não vejo diferença de uso entre netcap e telnet para o que eu queria alcançar. Obrigado pelo esforço, no entanto, Terdon, se eu pudesse votar mais na sua resposta, eu o faria.
Bentley4
1
@ Bentley4 não tem problema, usar ncé a melhor solução, você deve aceitá-lo.
terdon
Não consigo ver como interacté o caminho certo para terminar esse expectscript.
2rs2ts
@ 2rs2ts Eu sei muito pouco sobre esperar, você pode estar certo, mas não posso dizer, pois seu comentário não me disse por que você acha que está errado. Meu entendimento é que interact"dá o controle do processo atual ao usuário, para que as teclas sejam enviadas ao processo atual e o stdout e o stderr do processo atual sejam retornados" (é de man expect). Portanto, interacté a maneira de fornecer ao usuário uma maneira de realmente usar a conexão telnet.
terdon
Como a pergunta original era sobre alimentar o conteúdo de um arquivo em telnetvez de interagir com ele, acho que você deveria terminar com close -i $spawn_idalgo assim. Então o script será encerrado. Com interact, na verdade, não consegui sair telnete tive que fechar meu terminal. Bastante miserável (embora possa ter sido parcialmente culpa minha.)
2rs2ts