domingo, 9 de fevereiro de 2014

3 Formas de fazer Request http em Shell-script

Irei demonstrar 3 formas diferentes de se obter o conteúdo de uma pagina
web usando shell-script , a primeira delas é usando o wget , segue o comando abaixo:
$ wget localhost -O - -q

Caso queira você pode guardar a saída do comando em uma variável da seguinte maneira:
$ body=$(wget google.com.br -O - -q)

A segunda forma é usando o curl , é tão simples quanto o wget:
$ curl localhost

A terceira forma é usando o /dev/tcp , é um arquivo do sistema que permite que você interaja
diretamente com o protocolo TCP , a sintaxe básica para fazer uma conexão é /dev/tcp/<host>/<porta>
como estamos fazendo um request http , e a porta padrão de servidores http é a 80, nosso comando ficara da seguinte maneira:
$ exec 5<>/dev/tcp/localhost/80
$ echo -e "GET / HTTP/1.0\n" >&5
$ cat <&5

Diferente dos outros dois comandos vistos anteriormente , alem de ser exibido a source da pagina , os headers
da resposta recebida também serão visíveis na saída do comando.

Os comandos acima foram só um exemplo básico de como fazer um simples request http (GET).
É possível definir os headers do request , por exemplo , user-agent,
cookies , fazer post request , entre outros vejam os exemplos abaixo:

Post request usando o comando curl:
$ cat /var/www/exemplo.php
<? print_r($_POST); ?>
$ curl -F campo1=valor -F campo2=outro-valor localhost/exemplo.php
Array
(
    [campo1] => valor
    [campo2] => outro-valor
)


caso queira upar um arquivo da maquina local é só colocar um @ seguido do nome do arquivo, exemplo:
$ curl -F file=@/etc/issue -F enviar=sim site.yyy/upload.php

Definindo user-agent usando o wget:
$ cat /var/www/teste1.php
<?php
    print $_SERVER['HTTP_USER_AGENT']."\n";
?>
$ wget --user-agent="TESTE-AGENT" localhost/teste1.php -qO -
TESTE-AGENT


Definindo "referer" usando o /dev/tcp:
$ request='GET /referer.php HTTP/1.0
> Host: localhost
> Accept: text/css,*/*;q=0.1
> Referer: http://abcdefghi.uuu.yy
>
> '
$ exec 5<>/dev/tcp/localhost/80
$ echo -e "$request" >&5
$ cat <&5
HTTP/1.1 200 OK
Date: Wed, 13 Nov 2013 22:32:02 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.9
Vary: Accept-Encoding
Content-Length: 24
Connection: close
Content-Type: text/html

http://abcdefghi.uuu.yy

Os comandos wget e curl tem muitos parâmetros por isso não abordei todos eles, caso queira saber mais sobre a solução está ai abaixo:
$ man curl
$ man wget

Usando o /dev/tcp corretamente é possível fazer qualquer tipo de request http, por isso considero a melhor opção :D , mas não a mais pratica, a mais pratica realmente é o comando curl.

Nenhum comentário:

Postar um comentário