segunda-feira, 12 de janeiro de 2015

Shell Script - CGI - Executando scripts direto do navegador

Olá pessoal, nesse post iremos utilizar CGI (Common Gateway Interface) que nada mais é do que uma forma simples de rodar programas usando a Internet.

Primeiramente temos que preparar o ambiente. Teremos que ter o Apache instalado, caso você não tenha e, se tiver no Linux, dê o seguinte comando para instalar:

sudo apt-get install apache2

Lembrando que o Apache possui versão tanto para Windows, Linux e Mac. Vamos testar para ver se está tudo funcionando. Primeiro certifique-se que o serviço está rodando:

service apache2 status

Se não tiver rodando (running), então faça:

service apache2 start

Abra o seu navegador e digite no endereço:

http://127.0.0.1

Se aparecer a página do Apache é porque está tudo ok:


Certifique-se que o módulo CGI está sendo carregado:

nano /etc/apache2/mods-available/cgi.load


Agora vamos verificar se o módulo está habilitado no arquivo:

nano /etc/apache2/mods-enabled/cgi.load


Abra o arquivo /etc/apache2/mods-enabled/mime.conf para dizer ao Apache qual formato será reconhecido:

nano /etc/apache2/mods-enabled/mime.conf

Basta procurar pela linha:

#AddHandler cgi-script .cgi


Veja como ela irá ficar:


Agora iremos escolher um diretório para colocar os arquivos CGIs e páginas. Irei colocar dentro de /tmp/shell.

Esse diretório deve ser acessível pelo usuário do sistema que o Apache utiliza, então faça:

chown www-data /tmp/shell

As linhas seguintes irei colocar ao final do arquivo /etc/apache2/apache2.conf


A configuração está sendo feita no Apache 2.4, por isso utilizei o "Require all granted". Dependendo da sua versão, isso pode mudar. Salve e saia do arquivo. Reinicie o apache:

service apache2 restart

Agora acesse no browser: http://localhost/shell


Se apareceu a listagem de diretório como na imagem acima, então está tudo ok. Caso tenha alguma falha, acesse o log de erro do Apache para tentar solucionar o problema.

Terminamos de preparar o ambiente, agora iremos dar o famoso "Hello World".

Veja um script bem simples chamado "hello_cgi.sh" (eu salvei ele dentro do /tmp/shell/ que foi o diretório que configuramos no apache):


Agora dê a permissão de execução pra todos os usuários:

chmod +x /tmp/shell/hello_cgi.sh

Testando o script que acabamos de criar:


Com isso temos a certeza que o usuário do Apache consegue rodar esse programa.

O Content-type está dizendo ao Apache que o conteúdo é um texto simples (poderia ser um código HTML, pdf, zip etc.). Essa linha é obrigatória, tem que informar o tipo e a segunda linha deve ser uma linha em branco. Se não fizer isso, então terá um "Internal Server Error".

Vamos testar direto do navegador?

Acesse: http://localhost/shell/hello_cgi.sh


Funcionou!! :) O que aconteceu é que o programa em shell enviou uma mensagem ao navegador. O Apache é a ponte que faz essa conexão.

Agora salve uma página chamada "index.html" no /tmp/shell com o seguinte conteúdo:


Agora acesse http://localhost/shell e veja o que aparece:


Veja só, ele reconheceu como a página principal e exibiu ela sem precisar fazer http://localhost/shell/alguma_pagina.html

Agora vamos modificar nosso arquivo "hello_cgi.sh".


Perceba que mudei o Content-type para html.

Para testar, acesse: http://localhost/shell/hello_cgi.sh


Que tal fazermos um exemplo onde o usuário entra com algum dado (formulário)? Bem mais interessante não? Vamos lá!

Antes iremos renomear o arquivo "hello_cgi.sh", vamos chamá-lo de "form.sh", fica mais intuitivo:

mv hello_cgi.sh form.sh

Iremos voltar para editar o nosso "index.html", veja como ele fica:


Perceba que é um formulário bem simples com dois campos: um para digitar o nome e outro para digitar o endereço de um site.


Agora iremos editar o "form.sh" (lembre-se que nós renomeamos o "hello_cgi.sh" para "form.sh"). Veja só o código:


Bem fácil o código não é mesmo? Ele está todo comentado para facilitar o entendimento. Agora vamos testar:

Preenchendo os dados...


Depois de clicar no botão "Enviar"...


Espero que o post tenha sido útil, quaisquer dúvidas deixem nos comentários, até a próxima!


Nenhum comentário: