A porcaria do Windows não faz isso?! Não diga! (Parte 3)

Meu amigo, e co-autor deste blog, MaRZ, me pediu para pegar leve com os insultos aos maníacos pelo Windows. Só que eu não resisto. Eis mais uma coisa que a Microsoft não colocou nele!

Suponha que vocẽ tenha feito um webservice bem simples. Seu site devolve uma string de acordo com um conjunto de critérios que vocẽ passe para ele. Só que vocẽ quer criar um script em bash para ler esse resultado sem usar nenhum programinha bobo. Ou seja, só pode usar as funções built-in do bash.

Um exemplo, do excelente post do blog de outro amigo meu, o @Kl0nEz, que pode ser lido aqui, mostra como. Antes de cair de boca no código, é necessária uma explicação:

Existem 3 handlers para dispositivos do tipo character que são padrão em qualquer distribuição unix ou derivadas. Esses handlers também estão disponíveis diretamente em qualquer programa escrito em C/C++, são eles: stdin, stdout e stderr. Esses handlers são padronizados em 0 (para stdin), 1 (para stdout) e 2 (para stderr).

A entrada padrão (stdin) é o teclado e a saída padrão (stdout) é o vídeo, assim como a saída de erros padrão (stderr). No exemplo abaixo criaremos um hadle com valor 3 justamente para não sobrepor os 3 primeiros – que são definidos pelo sistema. O que acontece quando você tenta sobrepor um dos hadles do sistema? Well… faça uma experiência!!! ;)

Agora, vamos ao nosso exemplo… Vamos aqui obter o HTML da página do Google (http://www.google.com/) via bash:

$ exec 3<>/dev/tcp/www.google.com/80
$ echo -e "GET / HTTP/1.1\n\n" >&3
$ cat <&3
HTTP/1.1 302 Found
Location: http://www.google.com.br/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: ********
Set-Cookie: ********
Date: Fri, 20 May 2011 13:58:07 GMT
Server: gws
Content-Length: 222
X-XSS-Protection: 1; mode=block

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.br/">here</A>.
</BODY></HTML>
$ exec <&3-

Lembre-se que os 3 comandos dados (exec, echo e cat) são built-in no bash! A primeira linha cria o handle 3, bidirecional, e o associa ao dispositivo de caracter /dev/tcp/url/porta. A segunda linha envia a requisição para o handle, de acordo com a RFC 2616. Tudo o que temos que fazer, na terceira linha, é ler o handle 3 para obter a resposta do site.

No final de tudo temos que fechar o handle 3. É isso o que a última linha faz.

É claro que esse exemplo ai em cima mostra a instrução de redirecionamento do google (error code 302). Acredito que @Kl0nEz tenha escolhido justamente esta URL para manter o HTML pequeno e ser usado como exemplo no post dele. Fiz o mesmo aqui.

Com esse recurso podemos obter a resposta de um site, colocá-lo numa variável e retirar aquilo que precisamos.

Agora responda: Você consegue fazer isso num arquivo .BAT, na porcaria do Windows?

Anúncios

2 comentários sobre “A porcaria do Windows não faz isso?! Não diga! (Parte 3)

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s