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: 19.070 ]

Por: Perfil removido em 09/04/2014


Iniciando / Variáveis de ambiente



Iniciando

Nas configurações padrões do Apache, existe um diretório já pré-definido para scripts CGI rodarem. É o /usr/lib/cgi-bin/.

Irei criar um arquivo com o nome tutorial.sh. Nos scripts CGI, a saída dos scripts (/dev/stdout e /dev/stderr), são enviadas para o cliente, as primeiras linhas do script serão o cabeçalho de resposta da requisição HTTP.

Desse modo, podemos forçar o download de arquivos, fazer redirecionamentos, etc, a quebra de linha é que separa o que será o cabeçalho e o que será o resto da resposta.

Voltando ao arquivo tutorial.sh, dentro do arquivo, coloque as seguintes linhas:

#!/bin/bash
echo -e "Content-Type: text/plain\n"    # É o Cabeçalho, e a quebra de linha
echo "Hello World"    # Agora é o resto do request, o conteúdo que é exibido pelos navegadores.

Salve o arquivo e deixe as permissões como 775 (lembrando: r = 4, w = 2, x = 1).

Acesse o link: http://localhost/cgi-bin/tutorial.sh E verá a mensagem: Hello World

Por padrão, o Apache já configura o cabeçalho de resposta.

Se não quiser, você pode pôr no começo do script: echo -e "\n" ou printf "\n\n", e deixar que o Apache configure o cabeçalho, que normalmente, será algo parecido com isso:

HTTP/1.1 200 OK
Date: [...]
Server: Apache [...]
Content-Type: text/x-sh

Variáveis de ambiente

Em Shell Script, podemos ver quais são as variáveis de ambiente, usando o comando env. Se você digitar esse comando em um terminal, serão listadas diversas variáveis, como SHELL, HOME, USERNAME, etc.

Para listarmos as variáveis de ambiente no Apache, basta incluir no script o comando env, ficando da seguinte forma:

#!/bin/bash
echo -e "Content-Type: text/plain\n"
env

Salvei esse arquivo e acessei a página WEB usando o comando curl. O resultado, foi:

curl -i localhost/cgi-bin/tutorial.sh
HTTP/1.1 200 OK
Date: Tue, 25 Mar 2014 00:24:04 GMT
Server: Apache/2.2.22 (Debian)
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/plain

SERVER_SIGNATURE=
Apache/2.2.22 (Debian)
Server at localhost Port 80


HTTP_USER_AGENT=curl/7.26.0
SERVER_PORT=80
HTTP_HOST=localhost
DOCUMENT_ROOT=/var/www
SCRIPT_FILENAME=/usr/lib/cgi-bin/tutorial.sh
REQUEST_URI=/cgi-bin/tutorial.sh
SCRIPT_NAME=/cgi-bin/tutorial.sh
REMOTE_PORT=46944
PATH=/usr/local/bin:/usr/bin:/bin
PWD=/usr/lib/cgi-bin
SERVER_ADMIN=webmaster@localhost
HTTP_ACCEPT=*/*
REMOTE_ADDR=127.0.0.1
SHLVL=1
SERVER_NAME=localhost
SERVER_SOFTWARE=Apache/2.2.22 (Debian)
QUERY_STRING=
SERVER_ADDR=127.0.0.1
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
_=/usr/bin/env


Entendendo algumas variáveis:
  • HTTP_USER_AGENT :: User-agent que o cliente está usando. Pode ser usada para pegar informações sobre quem visita a sua página (navegador e sistema operacional).
  • REQUEST_METHOD :: Método de requisição utilizado, exemplo: GET, PUT, POST, OPTIONS, HEAD. Pode ser bem útil, pelo menos para mim, já foi.
  • QUERY_STRING :: Dados enviados via GET. Exemplo: localhost/cgi-bin/tutorial.sh?a=f&b=f (sendo: a = f e b = f).
  • REMOTE_ADDR :: IP do cliente.

Exemplo de utilização de variáveis de ambiente:

#!/bin/bash

cat < Content-Type: text/plain

-----------------------------------
Seu User-agent => $HTTP_USER_AGENT
Seu I.P => $REMOTE_ADDR
-----------------------------------
A

Testando:

curl localhost/cgi-bin/tutorial.sh
-----------------------------------
Seu User-agent => curl/7.26.0
Seu I.P => 127.0.0.1
-----------------------------------


    Próxima página

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

Lapidando a configuração do mplayer

Como se comunicar com outros usuários da rede

Instalação personalizada com Debian

IDS com Debian 4, Snort 2.8.3.1 e BASE 1.4.1

PostgreSQL 9.4 - O conceito de Role

Leitura recomendada

Introdução ao Shell Script - Baseado no livro de Ken O. Burtch

Personalize seu shell na entrada de seu logon

Introdução ao Fortran (parte 1)

Cansou do Konsole e GNOME-Terminal? Existem outros terminais, escolha o seu!

Monitoramento automático de logs e alertas por e-mail - Fácil e explicado

  
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 removido 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

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts