By Marcos Oliveira,

Como Rodar Shell Script e Python via Apache no Linux

O tutorial de hoje vamos configurar o Apache para rodar Shell Script e Python como exemplos, mas você pode testar em qualquer linguagem de programação de seu interesse. Também vamos usar de cobaia o Arch Linux, mas com mínimas adaptações é o mesmo procedimento pra qualquer Linux ou BSD, e até mesmo qualquer sistema baseado em UNIX.

Let’s go!


  • 1º - Atualize todo o sistema de maneira efetiva com os dois comandos abaixo
sudo pacman -Syy
sudo pacman -Syu
  • 2º - Instale o Apache
sudo pacman -S apache
  • 3º - Habilite o Apache para iniciar junto com o sistema e também start para já poder usá-lo:
sudo systemctl enable httpd.service
sudo systemctl start httpd.service
  • Por padrão o conteúdo que acessa pelo localhost está no endereço /srv/http/ lá após instalação não haverá nada, então crie um arquivo index.html e insira um conteúdo nele para poder visualizar, use um editor de texto ou com o comando abaixo:

    Lembre-se que dentro deste diretório precisa ser root ou sudo , não tente sudo echo

echo 'Minha pagina HTML' | sudo tee /srv/http/index.html

Agora abra o navegador e acesse o endereço: http://localhost/ , você verá o conteúdo que você escreveu.


Usando um diretório alternativo sem precisa de root ou sudo

Os diretórios de usuários estão disponíveis por padrão através de http://localhost/~usuario/ e mostram o conteúdo de ~/public_html

Note que há o sinal til (~) na URL, logo digite ela também antes do seu nome de usuário, caso contrário haverá erro 404, exemplo:

Mas para criar uma visualização customizada é necessário criar o diretório, alterar as permissões e criar um arquivo html:

mkdir ~/public_html
chmod o+x ~
chmod o+x ~/public_html/
chmod o+r ~/public_html/
echo 'Teste de página WEB com diretorio do usuario' > ~/public_html/index.html
sudo systemctl restart httpd.service

Depois acesse o endereço: http://localhost/~seu_usuario/


Entendimentos básicos

O Apache possui opções e diretivas <Directory ..i> para determinar suas configurações.

O arquivo de configuração principal é /etc/httpd/conf/httpd.conf , que inclui vários outros arquivos de configuração. Ao abrir ele verifique que as linhas que estão descomentadas(sem começar com tralha #), quer dizer que já estão pré-configuradas pra você, vejamos alguns exemplos:

  • ServerRoot “/etc/httpd” - Diretório raíz do Apache onde ficam os arquivos de configuração /etc/httpd/conf/ e os módulos /etc/httpd/modules/
  • Listen 80 - Porta que o servidor irá exibir as páginas na Web via http, se quiser que fique acessível só pra seu computador e ninguém consiga acessar externamente altere para Listen 127.0.0.1:80
  • ServerAdmin you@example.com - Este é o endereço de e-mail do administrador, que pode ser encontrado, por exemplo, em páginas de erro. Se quiser altere para o que você deseja.
  • DocumentRoot “/srv/http” - Este é o diretório onde você deve colocar suas páginas da web. Você pode alterá-lo, mas não se esqueça de também alterar <Directory "/srv/http"> para o que você mudou seu DocumentRoot , ou você provavelmente vai ter um erro 403 (falta de privilégios) quando você tenta acessar a nova raiz do documento. Não se esqueça de alterar a linha Require all denied para Require all granted , caso contrário, você receberá um erro 403 . Lembre-se de que o diretório DocumentRoot e suas pastas pai devem permitir permissão de execução para outros (pode ser configurado com chmod o+x /path/to/DocumentRoot ), caso contrário você obterá um erro 403 .
  • AllowOverride None - Esta diretiva nas seções <Directory> faz com que o Apache ignore completamente os arquivos .htaccess . Observe que esse é o padrão do Apache 2.4, portanto, é necessário permitir explicitamente substituições se você planeja usar arquivos .htaccess . Se você pretende usar mod_rewrite ou outras configurações em arquivos .htaccess , pode permitir quais diretivas declaradas nesse arquivo podem substituir a configuração do servidor.
  • ServerSignature Off - Para ocultar informações do servidor, como as versões do Apache, linguagem, sistema operacional…
  • Include conf/extra/httpd-userdir.conf - Se você não quiser que os diretórios dos usuários estejam disponíveis na web, comente essa linha. Ou se quiser alterar o nome e/ou localização do mesmo, edite o arquivo: /etc/httpd/conf/extra/httpd-userdir.conf.
  • Entre outras opções e diretivas que podem ser vistas no próprio arquivo.

Habilitando Shell Web cgi

Introdução

O CGI (Common Gateway Interface) define uma maneira de um servidor da Web interagir com programas geradores de conteúdo externos, que são geralmente chamados de programas CGI ou scripts CGI. É uma maneira simples de colocar conteúdo dinâmico em seu site, usando qualquer linguagem de programação com a qual você esteja mais familiarizado.

  • 1º - Procure no arquivo de configuração do Apache /etc/httpd/conf/httpd.conf a linha que possui esse conteúdo LoadModule cgid_module modules/mod_cgid.so ou algo parecido, use um editor de texto (por exemplo, no Vim /LoadModule cgid_module.* ) ou se quiser procurar diretamente pelo terminal, rode: egrep 'LoadModule cgid_module modules.*' /etc/httpd/conf/httpd.conf . Verifique que ela estará comentada (com uma tralha # na frente) , mais ou menos assim: #LoadModule cgid_module modules/mod_cgid.so , tire a tralha da frente e deixe mais ou menos assim: LoadModule cgid_module modules/mod_cgid.so

  • 2º - Próximo passo é verificar se a linha correspondente ao ScriptAlias está descomentada, procure a linha ScriptAlias /cgi-bin/ "/srv/http/cgi-bin/", geralmente ela já está descomentada e pronta pra uso e também pode ser que ela esteja apontando para outro diretório, lembre-se desse diretório, pois é lá que você guardará seus scripts. Isso quer dizer que você vai guardar no diretório /srv/http/cgi-bin/ , mas acessará o conteúdo pelo endereço: http://localhost/cgi-bin/ . Se o diretório não existir, crie: sudo chmod -p /srv/http/cgi-bin/ .

  • 3º - Permitir a execução de CGI utilizando a diretiva Options . Encontre as tags mais ou menos iguais a essa abaixo, na sua distro pode ser que esteja com o caminho diferente, mas esse exemplo é no Arch Linux, mas serve pra qualquer distro:

<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

Altere e insira a linha Options +ExecCGI antes de AllowOverride None, ficando assim:

<Directory "/srv/http/cgi-bin">
    Options +ExecCGI
    AllowOverride None
    Options None
    Require all granted
</Directory>

Não esqueça de ir salvando o arquivo a cada alteração correta feita.

  • 4º - O quarto passo é adicionar a diretiva AddHandler as extensões de arquivo que você deseja que ele aceite, encontre a linha que tem a palavra Addhandler e altere como deseja, por exemplo, ela vai estar mais ou menos assim:

Essa palavra pode ser encontrada em outros lugares do arquivo, mas a única linha que não possui tralha # na frente, é justamente a que você deve alterar.

AddHandler cgi-script .cgi

Vamos supôr que você vai querer rodar no seu servidor extensões Shell Script .sh , Python .py e Perl .pl , então deixe ela assim:

AddHandler cgi-script .cgi .sh .py .pl

Além, lógico, dos arquivo com extensão .cgi que provavelmente haverá qualquer linguagem de programação, e quem irá identificar é SheBang #!/bin/linguagem que estará no arquivo.

  • 5º - Criando um arquivo de teste para verificarmos se já está tudo ok, exemplo para shell script:
sudo vim /srv/http/cgi-bin/teste.sh

Dentro do arquivo coloque esse conteúdo:

Obs.: Respeite a linha em branco logo abaixo da shebang um echo vazio logo abaixo de echo "content-type: text/html" também precisa ser respeitado, caso contrário haverá erro exibido pelo apache.

Arquivo exemplo:

#!/bin/bash
  
echo "content-type: text/html"
echo
echo
echo "
  <html> <head> <meta charset='utf-8' /> <title> CGI script </title> </head>
  <body>
  <h1>Algumas informações sobre a máquina que o CGI está rodando:</h1>
  "
  
echo "<h4>uptime</h4>"
echo "<pre>$(uptime)</pre>"
  
echo "<h4>uname</h4>"
echo "<pre>$(uname -a)</pre>"
  
echo "<h4>/proc/cpuinfo</h4>"
echo "<pre>$(cat /proc/cpuinfo)</pre>"
  
echo "
  </body>
  </html>
 " 

Exemplo Python:

#!/usr/bin/python

print("Content-Type: text/plain;charset=utf-8")
print("")
print("Hello World!")
  • 6º - Dando as permissões necessárias para o Apache ler o navegador ler o arquivo e o diretório :
sudo chmod -R a+x /srv/http/cgi-bin/

Reinicie o Apache

sudo systemctl restart httpd

Clique Aqui Para Assistir ao Vídeo

Solução de possíveis problemas

  • O Apache usa um programinha chamado suexec que serve pra gerar problemas de permissão ☹ . Verifique ele está habilitado e carregado com o Apache, use o comando: apachectl -V se na saída houver a uma linha com o conteúdo: -D SUEXEC_BIN=”/usr/bin/suexec” , tente renomear ele e reiniciar o Apache e depois verifique se agora funcionou a exibição via browser:
sudo mv /usr/bin/suexec /usr/bin/suexec_tchau
sudo systemctl restart httpd
  • Se aparecer mensagens como: Proibido, POST Method Not Allowed,… Verifique os logs de erro lá em /var/log/apache_ou_http/ .
  • Problemas com caracteres em Hexadecimais em requições POST ou GET ? Haha, aí é seu programinha que irá resolver, esse não é um problema do Apache, no entanto, existem alguns módulos que podem lhe ajudar, mas vai por mim, é melhor você mexer a cuca e tentar resolver com sua linguagem de programação! ☻

Dicas adicionais

  • Se quiser que o Apache leia seus index.sh, index.py,… encontre a palavra index.html e ao lado dela inclua os indexes que deseja, exemplo:
DirectoryIndex index.html index.sh index.py
  • Você pode habilitar o TLS;
  • Criar uma chave e um certificado (autoassinado) OpenSSL CSR
  • Virtual Hosts /etc/hosts
  • Integração com MySQL e PHP.
  • Protocolo HTTPS.

Conheça nosso Treinamentos de Shell Script, Vim, Expressões Regulares e Sed

http://terminalroot.com.br/cursos

Crie Sua Promoção

http://terminalroot.com.br/promo

Acompanhe todos os vídeos da Série Shell Script Profissional

#ShellPro

Links Úteis

Abraços! ☝



Sobre o Autor

Marcos Oliveira

A alegria está na luta, na tentativa, no sofrimento envolvido e não na vitória propriamente dita. A força não provém da capacidade física. Provém de uma vontade indomável.
Mahatma Gandhi


Dê você também uma Contribuição
Compartilhe nas suas Redes Sociais!




Inscreva-se no Nosso Canal do Youtube



DioStore - A sua loja geek!

A melhor Loja Geek do Brasil. Os produtos mais criativos, como: canecas, camisetas, capachos, almofadas, etc. Venha conhecer a loja nerd mais legal da internet. Nós criamos produtos geek e nerd de alta qualidade para um público apaixonado, autodidata, tecnológico e absolutamente exigente.



Curso Extremamente Avançado em Shell Script Bash

Você irá descobrir técnicas avançadas de escrever em Shell Script. Como criar instaladores para distribuições Linux, Animações, Documentações, além de tudo sobre Processos em sistemas tipo UNIX, detalhes sobre Comandos Avançados e Muito Mais !



Crie Sua Própria Promoção

Customize seus Pacotes de Treinamentos obtendo descontos muito em conta!