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


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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.