[BASH] Socket direto do shell, quem precisa de wget ?

Qualquer pessoa que cria shell scripts sabe que wget é um item essencial. Mas mesmo conhecendo bem wget, não é fácil enxergar exatamente oque trafega entre seu computador e o servidor web. Sem falar que quando o canal não é exatamente tcp/http não é a ferramenta certa. Nestes casos você pode usar netcat (nc) e/ou telnet, mas precisa conhecer bem, não só o que está fazendo, mas as ferramentas também.


Acontece que é possível usar um recurso nativo do bash para se conectar em um socket com tcp ou udp, enviar oque quiser pra lá, e ler o retorno.

A referência é:
http://tldp.org/LDP/abs/html/devref1.html#DEVTCP

Se está ansioso pra ver funcionar basta fazer:
glaudiston:~$ exec 3<>/dev/tcp/www.google.com/80
glaudiston:~$ echo -e "GET / \n" >&3
glaudiston:~$ dd <&3
HTTP/1.0 302 Found
Location: http://www.google.com.br/?gws_rd=cr&ei=KLR6UpifLYi0kQf80IHYCw
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=a146f073964c1a11:FF=0:TM=1383773224:LM=1383773224:S=MonOb7kSx4X4ewKG; expires=Fri, 06-Nov-2015 21:27:04 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=WgTgvENchOFRL9WCEmAaPBq2heUhEB1xf7cPS-PkYuBjPgT3ipgT8dJp2bovlEZ2R_yQs7xQd3sMRUirA3Vtax2TA2tsloD7x0Sr_LHT_GbVmZY8dkXiLhnPbGxa9ReW; expires=Thu, 08-May-2014 21:27:04 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Wed, 06 Nov 2013 21:27:04 GMT
Server: gws
Content-Length: 262
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic


302 Moved

302 Moved


The document has moved
here.
2+1 registros de entrada
2+1 registros de saída
1095 bytes (1,1 kB) copiados, 0,000160237 s, 6,8 MB/s

glaudiston:~$ exec 3<&-;exec 3>&-


Basicamente você vai criar um novo file descriptor: o exec vincula a execução ao bash em execução, o 3 é o número do descriptor que escolhi o "<>" diz que um caminho duplo ou seja, você envia e recebe dados. Depois é só direcionar oque você quiser para este descriptor, isto pode ser feito com qualquer comando ou saída do shell, o básico é usar o echo, mas pode ser desde cat até dd.
Para receber dados, você pode (por exemplo) usar o dd, que permite limitar os bytes recebidos e o buffer, ou pode simplesmente fazer um cat.

por ultimo o exec 3<&-;exec 3>&- desconecta o socket.

ah, e antes que pergunte, não o /dev/tcp não existe fisicamente o /dev/udp tbm não. São Built in do bash.

Comentários

Postagens mais visitadas