Existem algumas maneiras diferentes ...
- use o sudo como já foi descrito
- configura o Apache com o recurso suEXEC (pode não ser uma opção com php?)
- use um pequeno programa setuid que invoca seu código
- e tem mais ...
O mais fácil é provavelmente usar o sudo, e isso já foi descrito.
Um resumo rápido da opção sudo:
- certifique-se de que o / etc / sudoers não tenha "Padrões requiretty"
- adicione esta linha ao arquivo "apache ALL = NOPASSWD: / caminho / para / comando", o que significa que "sudo / caminho / para / comando qualquer" será executado como root se invocado como apache. (Isso pressupõe que seu servidor da Web seja executado como o usuário do apache).
No entanto, se você fizer isso, deixe-me apontar o perigo de tudo isso. Qualquer um que possa acessar sua página pode fazer o que for feito - com o userdel, eles podem excluir usuários (e possivelmente todos os seus arquivos), e dependendo de como o código é escrito, eles podem enganá-lo e deixá-los execute qualquer comando arbitrário como root.
(Agora, se configurado corretamente, o sudo pode limitar o que eles podem fazer, assim como um programa escrito corretamente (apesar de escrever programas seguros setuid, CGI e php (que usam shell_exec () como você é) pode ser complicado pode ser bastante destrutivo por si só.)
Então ... se você fizer isso, no mínimo, certifique-se de que o sudo (se você usa o sudo) esteja configurado para executar apenas os comandos que precisam ser executados e certifique-se de que sua página não esteja acessível para qualquer pessoa - bloqueie-a atrás de uma senha no Apache, por exemplo, e seja especialmente cauteloso se ela estiver na Internet, e não atrás de um firewall corporativo (mas, mesmo assim - não confie no firewall para torná-lo seguro). Certifique-se de que outras pessoas não confiáveis não possam adicionar programas CGI ou PHP neste host, pois eles também poderão usar essa linha em / etc / sudoers.
Como você está usando o shell_exec () do php, tenha muito cuidado com os argumentos que seu código alimenta para esse comando. Se você deixar o usuário colocar o que ele quiser lá, ele pode fazer qualquer coisa.
Suponha que seu comando seja "userdel $ user" e $ user veio diretamente do usuário desta página da web. Se usuário="foo; reboot". Se isso estava sendo executado como root ... seu computador iria reiniciar. Mas mesmo que não seja executado como root, ele poderia executar o código como o usuário do apache que poderia tentar entrar na máquina.
Dito isso, como higienizar adequadamente suas entradas é um tópico mais longo do que essa simples resposta realmente permite - não estou realmente tentando abordar todo esse tópico, apenas para abordá-lo.