[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Comunicação TCP/IP em bash
From: |
mcaruccio |
Subject: |
Comunicação TCP/IP em bash |
Date: |
Mon, 10 Nov 2003 20:32:38 -0000 |
User-agent: |
eGroups-EW/0.82 |
Primeiramente peço desculpas pela mensagem anterior, vazia. Problemas
com esse maldita interface WEB do Yahoo. Abiaxo segue a mensagem que
deveria ter ido antes.
Enfim !!! Após anos de muita pesquisa, milhares de neurônios
queimados, kilômetros de caracteres digitados, consegui encontrar a
solução para o "problema" do /dev/tcp/XXX/YYY aberto.
Para quem não sabe o bash (> 2.alguma_coisa) possui um diretorio
especial, onde o usuario fornece um endereco IP/hostname e uma porta e
o bash conectar no host. Basta escrever (echo) para este arquivo que
os dados sao enviados ao host remoto.
O negocio é que eu só conseguia enviar coisas pelo socket:
echo -ne "GET /junk HTTP/1.0\n\n" > /dev/tcp/1.2.3.4/80
mas nunca conseguia ler nada pois o socket estava fechado logo apos o
echo morrer. Baseado numa dica do Jeffman, cheguei a duas solucoes.
A primeira delas deve, obrigatoriamente, utilizar um sub-shell (um
shell script normal):
##############################################
#!/bin/bash
echo -ne "GET / HTTP/1.0\n\n" 1>&0 ## envia
cat <&0 ## lê
##############################################
O script deve ser chamado desta forma:
./script.sh <> /dev/tcp/1.2.3.4/80
Dentro dele o bash fecha o stdin e abre o socket como RW, que toma
conta do fd 0. Ai fica barbada, basta ler/escrever em &0
A outra solucao pode ser utilizada em um shels interativo e so possui
um comando anterior aos comandos de IO:
##############################################
$ 3<>/dev/tcp/1.2.3.4/80
$ echo -ne "GET / HTTP/1.0\n\n" 1>&3
$ cat <&3
##############################################
A primeira linha cria um descritor cujo fd é 3. Dai em diante basta
escrever e ler no mardito !
Agora so resta saber como fechar esse descritor (com 3<&- nao funcionou)
[]s
Mateus
PS: Aurélio, bom item para colocar no teu canivete ;)