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.
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.
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
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
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
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
-----------------------------------
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 ?