Concrete Logo
Hamburger button

Brincando com Shell Script: Como construir um servidor HTTP (de brinquedo)

  • Blog
  • 13 de Junho de 2014
Share

Será que você sabe o que comandos simples executados no bash ─ pequenos shell scripts ─ podem nos proporcionar? Bash é uma ferramenta muito poderosa, mas que é normalmente subestimada por parecer simples.

Para redefinir este conceito, hoje vamos fazer algo incomum para uma linguagem de scripts batch: criaremos um servidor HTTP (de brinquedo).

Segundo a Wikipedia, “o Hypertext Transfer Protocol (HTTP), em português Protocolo de Transferência de Hipertexto, é um protocolo de comunicação (na camada de aplicação segundo o Modelo OSI) utilizado para sistemas de informação de hipermídia, distribuídos e colaborativos. Ele é a base para a comunicação de dados da World Wide Web”.

Ou seja, HTTP é o “idioma” usado na conversa entre o seu navegador (IE, Firefox, Chrome, Safari, etc.) e o servidor web que está fornecendo conteúdo (Apache, IIS, Lighttpd, etc.).

Como todo protocolo, o HTTP implementa um conjunto de regras que, quando seguidas, permitem a comunicação entre o cliente e o servidor. Basicamente, quando acessamos um site, nosso navegador faz uma solicitação (existe um método, também conhecido como verbo, chamado GET, que solicita um determinado documento/recurso ao servidor) e recebe um código de resposta do tipo 200 (OK), quando este recurso existe, e também o conteúdo do site.

O fluxo fica assim:

Usuário: digita www.meusite.com/blog no navegador

Navegador: através do protocolo HTTP, faz uma solicitação “GET /blog” para o servidor www.meusite.com

Servidor: Recebe a solicitação, verifica que o destino /blog é válido, retorna um código 200 – OK para o navegador, e em seguida retorna o conteúdo da página /blog.

Então, agora que já conhecemos o HTTP, como poderemos implementar estes recursos usando Shell Script?

Começamos definindo como nossa aplicação funcionará:

  • Teremos um script que será executado em loop infinito, recebendo as requisições na porta 8080
  • Nosso script examinará a URL solicitada, direcionando para o destino correspondente
  • Teremos dois destinos válidos
  • Uma página de erro será exibida caso o destino seja inválido

Agora que já definimos a estrutura, vamos aos arquivos:

  • servidor-shell-http.sh => script principal
  • olavo.html => uma das páginas do site
  • wesley.html => outra página do site
  • erro.html => nossa página de erro padrão
  • daemon_ShellHTTP.sh => um script de controle do processo

Aqui em nosso ambiente usamos um Debian Sid 7.5 x86_64, mas qualquer distribuição com bash e as ferramentas citadas deve ser capaz de reproduzir o exercício. Vamos começar?

Tudo começa abrindo um novo terminal. Certifique-se que está usando o bash:

Ok, agora vamos criar uma pasta para organizar nossos arquivos do projeto:

Vamos criar os arquivos (você pode trocar os nomes das páginas se quiser):

Temos que dar permissão de execução para os scripts:

Agora, verifique se a sua distribuição possui o utilitário nc (ou netcat):

Se não possuir, instale por meio do seu gerenciador de pacotes (yum, apt-get, etc).

O netcat é um programa comum em distribuições Linux, e serve para manipular de um modo bem primitivo os protocolos TCP e UDP. Com ele, conseguiremos “ouvir” em uma determinada porta TCP e encaminhar a comunicação para outros comandos.

Observação: Em nosso teste, usaremos a porta 8080, porque portas abaixo de 1024 necessitam privilégios de root.

Já podemos começar a escrever o arquivo que inicializa o serviço. Vou usar o vim, mas você pode usar o editor de sua preferência:

O conteúdo final do arquivo deve ser este:

Este script basicamente implementa um loop infinito que recebe todas as solicitações na porta de nossa escolha (aqui ajustada como 8080) e direciona para o nosso script responsável pelas rotas. O script é interrompido quando pressionamos CTRL+C. O nosso script principal fica um pouco mais longo por causa dos comentários.

Vamos criá-lo:

Nosso servidor está pronto, mas precisamos agora criar as páginas que serão exibidas no navegador:

Agora vem a melhor hora: vamos testar! Basta executar o arquivo daemon:

O terminal não exibe nenhuma mensagem, mas se você quiser ter certeza que o serviço está no ar, em um outro terminal, digite:

O netstat mostra que a porta 8080 está em uso pelo processo nc, ou seja, nosso servidor HTTP está aguardando por novas conexões.

Vamos conectar usando o navegador e pedindo a URL localhost:8080/olavo:

olavo

Vimos que o Chrome conseguiu renderizar a página corretamente. Mas o que será que aconteceu no terminal? Vamos ver:

Nosso request foi registrado! Temos um log do request feito pelo navegador. Vamos tentar mais uma URL:

wesley

Conseguimos novamente:

Certo, mas e se tentarmos uma URL que não estava registrada em nosso shell script?

erro

Nosso servidor entende que esta página não existe na lista de URLs e exibe a página de erro padrão.

Nosso servidor de brinquedo foi construído utilizando comandos simples, como: cat associado aos operadores eof e <<, wc, netstat, nc, read e cut.

Bom, amigos, os recursos que mostramos aqui não são seguros ou fáceis de implementar em ambientes de produção, mas servem para dar uma amostra do poder desta ferramenta. O Shell Script pode ser usado para exibição de relatórios de performance, automatização de tarefas de sistema operacional e inúmeras outras atividades. Claro que quando o programa ultrapassa um certo tamanho, devemos considerar a utilização de linguagens de programação mais robustas e completas.

Dúvidas ou sugestões? Só deixar aqui embaixo! E todos os arquivos do exemplo estão disponíveis, para facilitar a vida de quem quiser testar. É só pedir nos comentários.

Até a próxima!