Como Rodar Shell Script e Python via Apache no Linux

Crie Sistemas Web com Shell Script ou Python de maneira rápida e prática.


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! ☝


apache shellscript python web


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Pacote Promocional com Todos os Cursos

Adquira todos os cursos para se tornar um ninja do Terminal e do Linux.

Mais detalhes

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!


caso queira entrar em contato conosco, envie-nos um e-mail.