Shell Script para WEB

Poucas pessoas sabem, que é possível usar Shell Script em servidores WEB através de CGI. Esse texto é uma pequena introdução, com alguns exemplos didáticos. Neste tutorial, eu usarei o servidor Apache, com todas as suas configurações padrões.

[ Hits: 12.777 ]

Por: Matheus em 09/04/2014 | Blog: http://hc0der.blogspot.com


POST e GET / Exemplos finais



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:
Linux: Shell Script para WEB

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!

Página anterior    

Páginas do artigo
   1. Iniciando / Variáveis de ambiente
   2. POST e GET / Exemplos finais
Outros artigos deste autor

Perl e MySQL

Leitura recomendada

O que é Shell Script

Introdução ao Shell Script (parte 2)

Introdução ao Shell Script

Introdução ao uso de Shell Script

Simples e rápido: matando todos os processos de um usuário

  
Comentários
[1] Comentário enviado por esdras_laroque em 22/04/2014 - 12:11h

Interessante.

Só não entendi porque você, no exemplo de POST, passou as variáveis com o parâmetro "--data" e não do modo como seria feito em um browser, seguindo o padrão do exemplo do GET: ?var=valor1&var2=valor2

Alguma restrição nesse sentido, para o POST ou poderia ser passado das duas formas ?

[2] Comentário enviado por Mmxm_bd em 22/04/2014 - 20:44h


[1] Comentário enviado por esdras_laroque em 22/04/2014 - 12:11h:

Interessante.

Só não entendi porque você, no exemplo de POST, passou as variáveis com o parâmetro "--data" e não do modo como seria feito em um browser, seguindo o padrão do exemplo do GET: ?var=valor1&amp;var2=valor2

Alguma restrição nesse sentido, para o POST ou poderia ser passado das duas formas ?


Porque usando o curl , quando se quer enviar parâmetros via POST é assim que se faz , agora parâmetros GET são enviados diretamente pela url , por isso a diferença , entendeu ?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts