Pegando dados enviados via POST e GET
Quando trabalhamos com desenvolvimento WEB, é comum receber dados via POST e/ou GET. Começarei com o GET, para POST, é praticamente a mesma coisa, só muda mesmo quando se faz upload de arquivos.
Em bash script, a variável IFS funciona como uma função split. Colocamos o que será delimitado, a variável seguinte se transforma em um vetor. Depois, usando o laço
for, podemos extrair os campos e valores respectivos enviados via GET:
d#!/bin/bash
echo -e "\n"
IFS='=&'
GET=($QUERY_STRING)
for ((i=0; i<${#GET[@]}; i+=2))
do
echo "${GET[@]:$i:1} = ${GET[@]:$i+1:1}"
done
Testando:
curl 'localhost/cgi-bin/tutorial.sh?teste=ffff&teste2=xxxxx'
teste = ffff
teste2 = xxxxx
Com POST, a única diferença é que não existe uma variável de ambiente com os valores. Para obter esses valores, basta o seguinte comando:
read variavel
Os dados enviados via POST ficam em
/dev/stdin, por isso, quando utilizamos o
read, esses valores são obtidos.
Feito isso, é só trocar o GET por POST:
#!/bin/bash
echo -e "\n"
read var
IFS='=&'
POST=($var)
for ((i=0; i<${#POST[@]}; i+=2))
do
echo "${POST[@]:$i:1} = ${POST[@]:$i+1:1}"
done
Testando:
curl localhost/cgi-bin/tutorial.sh --data "autor=mmxm&blog=hc0der.blogspot.com"
autor = mmxm
blog = hc0der.blogspot.com
Exemplos finais
Alguns exemplos que podem ser úteis (hehe).
Redirecionamento, usando
header:
#!/bin/bash
printf "Status: 302 Found\n"
printf "Location: http://hc0der.blogspot.com\n\n";
Testando:
curl localhost/cgi-bin/tutorial.sh -i
HTTP/1.1 302 Found
Date: Wed, 26 Mar 2014 00:01:08 GMT
Server: Apache/2.2.22 (Debian)
Location: http://hc0der.blogspot.com
Content-Length: 0
Content-Type: text/x-sh
Falso "404 not found":
#!/bin/bash
printf "Status: 404 Not Found\n\n"
Testando:
curl localhost/cgi-bin/tutorial.sh -i
HTTP/1.1 404 Not Found
Date: Wed, 26 Mar 2014 00:06:53 GMT
Server: Apache/2.2.22 (Debian)
Content-Length: 0
Content-Type: text/x-sh
Fazendo download de arquivos:
#!/bin/bash
arquivo_local=/etc/issue
stat -c "Content-Length: %s" $arquivo_local # enviar tamanho do arquivo em bytes
printf "Content-Disposition: attachment; filename=$(basename $arquivo_local)\n"
printf "Content-Type: application/octet-stream\n\n"
cat $arquivo_local
Testando:
$
curl localhost/cgi-bin/tutorial.sh -i
HTTP/1.1 200 OK
Date: Wed, 26 Mar 2014 00:13:32 GMT
Server: Apache/2.2.22 (Debian)
Content-Disposition: attachment; filename=issue
Content-Length: 17
Vary: Accept-Encoding
Content-Type: application/octet-stream
nao te interessa
E, via browser:
Conclusão
Para uma introdução, está de bom tamanho. Bash Script é complicado, conhecendo bem as ferramentas do seu sistema, não há limites para o que você pode fazer =>.
Referências de pesquisas, aqui:
Artigo também publicado, em:
MMxM 8l06: Shell-script para web
That's all folks!