Utilizando PHP e Apache para desligar um Ubuntu

Um dos problemas que encontro com os servidores que tenho que cuidar é esse: desligá-lo sem intervenção direta na máquina. A ideia de fazer um "desligador" com o PHP surgiu e fui pesquisar para realizar essa proeza.

[ Hits: 35.871 ]

Por: Evaldo Barbosa em 31/08/2010


O script comentado



<?
//VARIÁVEL QUE RECEBERÁ AS MENSAGENS DE ERRO OU DE SUCESSO
$msg = null;

//VERIFICA SE O MÉTODO DE ENVIO É POST
if ( $_SERVER["REQUEST_METHOD"] == "POST" ) {

//ARMAZENA O NOME DO HOST E O NOME DO SCRIPT LOCAL
  $host = $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"];

//ARMAZENA O HOST DE ONDE PARTIU A REQUISIÇÃO
//EXCLUI O CARACTERE '?' DO FINAL DO ENDEREÇO
//EXCLUI OS PROTOCOLOS http e https.
  $referer = preg_replace("/(http:\/\/|https:\/\/)/","", str_replace("?","",$_SERVER["HTTP_REFERER"]));

//VERIFICA SE O LOCAL QUE REQUISITOU É O MESMO QUE RECEBE
//IMPEDE QUE O DESLIGAMENTO SEJA REQUISITADO DE OUTRO LUGAR
   if ( $referer == $host ) {

//COMPARA OS CAMPOS ENVIADOS POR POST AOS HASHES DE USUÁRIO E SENHA AUTORIZADOS
      if ( md5($_POST["usuario"]) == "HASH_MD5_DO_USUARIO" && md5($_POST["senha"]) == "HASH_MD5_DA_SENHA" ) {

//EXECUTA O COMANDO HALT NO SISTEMA OPERACIONAL
         exec("sudo /sbin/halt");

//ARMAZENA A MENSAGEM DE SUCESSO EM $msg
         $msg = "<p class=\"ui-state-error\">Desligando o servidor</p>";
      } else {

//ARMAZENA A MENSAGEM DE ERRO EM $msg
         $msg = "<p class=\"ui-state-error\">Tentativa sem sucesso</p>";
      }
   } else {
//ARMAZENA A MENSAGEM DE ERRO EM $msg
       $msg = "<p>Tentativa sem sucesso</p>";
   }
}
? >

Página anterior     Próxima página

Páginas do artigo
   1. Idealizando o script
   2. O script comentado
   3. Dando cara ao script: fazendo uma interface simples
   4. Preparando o ambiente para fazer o desligador funcionar
   5. Configurando o /etc/sudoers
Outros artigos deste autor

Gerando gráficos com PHP e highcharts.com

Abordagem exemplificada de orientação à objeto com PHP 5

Abordagem exemplificada à Orientação a Objetos com PHP

Macromedia Studio 8 no Wine em detalhes

Construindo componentes em PHP e jQuery

Leitura recomendada

Instalando Lamp Stack no Servidor Debian

Guia completo do Ocomon no Linux - Módulo cliente, abertura de ocorrência (exclusivo VOL)

Utilizando o Smarty template no PHP

Utilizando PHP para validar dados passados pelo usuário

Usando cache na classe Fast Template

  
Comentários
[1] Comentário enviado por darkness23 em 01/09/2010 - 11:54h

Cara, show de bola, a idéia é realmente excelente, porém, existe algum padrão de nome para salvar os dois arquivos?
Meu error.log não exibe mensagem nenhuma, nem de sucesso, nem de falha...
Qual a parte do frontend do código que menciona o script para desligamento?
Ou estou fazendo algo errado, é tudo no mesmo arquivo?

Vlw, abs...

[2] Comentário enviado por evaldobarbosa em 01/09/2010 - 15:29h

Olha, se você criar um ambiente para o desligador no apache, como http://nome_servidor/desligador, você pode chamar o arquivo de index.php que ele será chamado automaticamente. Entendi assim a sua pergunta.
Se for outra coisa, me avise para eu poder ajudá-lo.

[3] Comentário enviado por amadureira em 01/09/2010 - 19:24h

Cara,
Gostei da criatividade. acho que toda a ideia é bem vinda, porém, não seria mais fácil e seguro utilizar ssh para conectar na máquina e mandar um int 0 ?

[4] Comentário enviado por dastyler em 01/09/2010 - 22:52h

Uma idéia boa, mas por um acaso voce tentou rodar um shell_exec no src em PHP chamando o init 0 ou o shutdown?

[]'s

[5] Comentário enviado por darkness23 em 02/09/2010 - 09:27h

Pois é Collapse, na realidade, eu havia colocado ele como index.php, o que não funcionou.
Dai vem a outra pergunta, perdoe minha possível ignorância, mas os dois códigos mostrados no artigo fazem parte de um mesmo arquivo ou são arquivos separados?
Em caso de arquivos separados, um não deveria chamar a execução do outro?
É nesta parte que me perdi um pouco...

[6] Comentário enviado por evaldobarbosa em 02/09/2010 - 12:24h

Amadureira, o caso é o seguinte: não tomo conta presencialmente dos servidores, por isso preciso dar autonomia aos meus clientes para que os mesmos desliguem as máquinas ao sair. Também não gosto de dar acesso físico à máquina pois já tive diversos problemas por isso.
Achei interessante fazer com PHP porque é fácil, trabalho com PHP e Linux há muito tempo, e também por ser cômodo para os clientes acessar o browser e mandar a máquina desligar.

[7] Comentário enviado por evaldobarbosa em 02/09/2010 - 12:28h

Dastyler, procurei em várias fontes e a mais fácil de implementar, com menor custo de horas pro resultado que tive realmente seria com o sudoers. O halt é um comando de nome bem pequeno que fica mais fácil de colocar no script, além de ser o comando que eu uso há anos para desligar.
Acho que a implementação ficou simples e clara, porém ela é só um exemplo, cada um pode usar esse script como base para melhorá-lo (não esqueçam de me avisar também, hein!).

[8] Comentário enviado por evaldobarbosa em 02/09/2010 - 12:29h

Darkness23, o index.php é o desligador, porém você tem que editar o arquivo /etc/sudoers para dar a permissão ao comando que o PHP vai executar.

[9] Comentário enviado por stremer em 02/09/2010 - 13:43h

cara... não achei muita utilidade na sua idéia... mas enfim... se criou deve ter.

só vou comentar pois o que você fez é EXTREMAMENTE PERIGOSO, portanto TENHA CUIDADO!

Não entendi pq você utilizou o md5 na comparação de usuário e senha. Seria para ninguem ver no código o usuário e senha??? Bem... se não utilizar https estará passando o usuário e senha e qualquer um tem acesso... pior ainda que o md5 é fraquissimo e existem mais de uma combinação que geram o mesmo hash.
outro problema que você esta executando um comando que deveria precisar do root... há problemas de permissão por ai, ou é seu apache que esta utilizando o usuário root???? Uma falha qualquer e pode entregar um shell como root para algum invasor...
EDITADO. Não tinha visto a ultima parte do sudo, porém mesmo assim alguem poderia ficar desligando a máquina da pessoa sem muito esforço.

Verificar que é um POST também não é segurança ... não entendi mesmo...


[10] Comentário enviado por stremer em 02/09/2010 - 13:56h

ah....
só para complementar... POST e REFERER podem ser facilmente forjados utilizando métodos muito simples, o mais simples dele seria instalar o plugin tamper data do firefox.

[11] Comentário enviado por darkness23 em 05/09/2010 - 16:22h

Pois é collapse, editei o arquivo /etc/sudoers...
Nada acontece no log e nem no micro, tenho um problema parecido com o seu, tenho servidores que não posso estar o tempo todo presente mas que dando permissões aos usuários de desligá-los me facilita bastante.
Tem alguma outra luz, pq realmente o código não funcionou nem com permissão concedida no sudoers...
Abs.

[12] Comentário enviado por evaldobarbosa em 06/09/2010 - 15:19h

Stremer, meu caro, esse artigo é só a simples implementação de uma ideia, não era pra esgotar o assunto segurança.
Acredito que V.Sa. deva ter seus servidores para cuidar e ajudar o cliente a não ter tanto trabalho para desligar o servidor (seja de arquivos, seja de internet) também faça parte do seu trabalho. Ou não?
Bom se você está tão preocupado com a segurança nesse script, deve saber que a mesma pode ser provida por outros hashes, uso do Deny do apache para conexões externas ao ambiente de rede do servidor em questão e coisas do tipo.Você poderia, também, se fosse o caso, escrever uma continuação do artigo falando a parte de segurança. Apoio-o nesse sentido, assim geraríamos mais conhecimento em torno dos assuntos abordados e a coisa não ficaria parecendo picuinha entre nerds. Meu interesse não é saber mais que os outros, mas aplicar o meu conhecimento para facilitar a minha vida e daqueles que do meu trabalho dependem.

[13] Comentário enviado por evaldobarbosa em 06/09/2010 - 15:22h

Darkness23, tive esse problema de não funcionamento quando não havia configurado o sudoers corretamente, simplesmente não funcionava mesmo.
Acho que você poderia dar uma olhadinha no seu arquivo de log do apache nesse dominio que você está usando, provavelmente lá apontará uma falta de permissão para o halt ou qualquer outro comando que você esteja usando para desligar. Se você não encontrar isso no seu log, posso tentar ajudar você a encontrar uma solução. Blz?

[14] Comentário enviado por darkness23 em 07/09/2010 - 13:46h

Collapse, vou dar mais uma verificada aqui e, sendo problemas alheios ao sudoers, agradeço se conseguirmos resolver juntos...
[]

[15] Comentário enviado por darkness23 em 07/09/2010 - 15:46h

Cara, verifiquei aqui o arquivo /etc/sudoers e realmente está correto, o arquivo simplesmente não funciona, os códigos são todos no mesmo arquivo?

[16] Comentário enviado por evaldobarbosa em 09/09/2010 - 10:26h

Darkness23, verificou o log do apache? Lá você deve achar indicação sobre algum erro de permissão.
Dá um 'tail -f /var/log/apache/arquivo_log_do_dominio.log' e executa o desligador no browser para ver se aparece uma mensagem dessas sobre o desligador, algo que diga que o desligador não tenha permissão para acessar o halt. Provavelmente encontrará isso.

[17] Comentário enviado por strambaioli em 09/09/2010 - 14:38h

Será que há possibilidade desse script fazer o processo inverso, ou seja, ligar uma máquina. pode ser via WOL (Wake on lan)..... Agradeço a atenção....

[18] Comentário enviado por evaldobarbosa em 09/09/2010 - 14:50h

Strambaioli, acredito que sim, mas tem que ver como essa mensagem seria mandada para a placa mãe, que é quem faz o serviço. Ligar não era a idéia, mas acho que pode ser implementada sim.
Se fizer a implementação, manda aqui para o VOL também.

[19] Comentário enviado por darkness23 em 10/09/2010 - 10:31h

Collapse, o meu error.log e access.log não exibe mensagem nenhuma, nem de erro e nem de sucesso, esse script simplesmente não faz nem cócegas no meu sistema, volto a lhe perguntar, devo colocar todos os códigos exibidos são salvos no mesmo arquivo???

Strambaioli, só pra eu entender... Vc quer acessar o apache do servidor com ele desligado??? É isso mesmo?!?!? como vc faria para acessar o micro e fazê-lo ligar se a máq. está desligada?

[20] Comentário enviado por strambaioli em 13/09/2010 - 15:53h

darkness23, mesmo a máquina estando desligada, pelo processo de WOL (Wake-on-lan) você consegue enviar um comando e re-ligar... O problema é que ás vezes a máquina trava e a placa de rede continua ligada pelo corrente elétrica. Por isso preciso de um script ou comando que consiga enviar algum comando via placa de rede para restart.

[21] Comentário enviado por alissonrezler em 28/03/2015 - 12:32h

cara, a ideia é ótima, mas sera q eu conseguiria fazer com q o usuário www-data execute o mpg321 para execução de musicas ?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts