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.321 ]

Por: Evaldo Barbosa em 31/08/2010


Configurando o /etc/sudoers



Para acessá-lo é necessário ter permissões de administrador. Acesse no seu terminal com o comando:

sudo vim /etc/sudoers

O arquivo tem algumas seções comentadas que garantem que você coloque as coisas certas nos lugares certos. As que usaremos são "User alias specification", "Cmnd Alias Specification" e o mais importante irá ao final do arquivo.

Na primeira seção que usaremos, a "User alias specification", escreveremos User_Alias WWW = www-data.

Na primeira seção que usaremos, a "Cmnd Alias Specification", escreveremos Cmnd_Alias SHUTDOWN_CMDS = /sbin/halt.

Ao final do arquivo escreveremos a permissão para que o usuário www-data (apache) realize o desligamento. Escreva:

WWW ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS

Verificando o funcionamento

Quando você for fazer a primeira tentativa de desligamento da máquina a partir do browser lembre-se que qualquer erro que aconteça irá para o log do apache e você pode visualizar o movimento em tempo real usando comando tail com o parâmetro -f seguido do nome do arquivo de log, que geralmente será /var/log/apache2/error.log, ou seja, no terminal digite: tail -f /var/log/apache2/error.log.

Assim que você enviar o formulário com usuário a senha corretos ele apresentará o resultado da requisição. Se aparecer no log a mensagem "halt: Need to be root" você deve refazer os passos e verificar se errou alguma coisa na implementação.

Conclusão

Como visto acima, configurar o apache não é escopo do nosso artigo, você pode colocar o desligador na DocumentRoot padrão do apache e a partir o endereço http://endereco_do_servidor/nome_do_arquivo_desligador.php ter acesso à funcionalidade.

Esse script foi o resultado de uma pequena pesquisa e que resolveu boa parte dos meus problemas com o desligamento de alguns computadores que eu mantenho nos escritórios de clientes. Dá liberdade para mim, pois não tenho que fazer atender tantos chamados e ao cliente porque ele pode desligar o servidor sem necessitar de intervenção de alguém com conhecimentos sobre Linux. O browser se torna suficiente.

Esse artigo tem a função de mostrar que podemos usar uma linguagem como o PHP para mais que só acesso a banco de dados para sites ou pequenos sistemas. Dá também para integrá-lo a outras funções, usar comandos como o halt e outros, que só os superusuários tem, também é possível. Tudo vem da experiência.

Página anterior    

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

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

Gerando gráficos com PHP e highcharts.com

Abordagem exemplificada à Orientação a Objetos com PHP

Macromedia Studio 8 no Wine em detalhes

Construindo componentes em PHP e jQuery

Leitura recomendada

Turck MMcache completo e sem mistérios

Capturando conteúdo de sites em PHP

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

Acessando o Twitter de 5 formas: protocolo HTTP, cURL, classe HttpRequest (PHP), função http_post_fields() do PHP ou PHP+libcurl

Criando gráficos com a classe JPGraph (parte 2)

  
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