
Quero desenvolver alguns scripts em php que invocarão os seguintes comandos; usando a função exec()
service network restart
crontab -u root /xyz/abc/fjs/crontab
etc.
O problema é que o Apache executa o script como usuário do Apache (estou no CentOS 5), independentemente de adicionar o Apache ao wheel oufazendo o bem, o mal e o feio a atribuição de grupo não executa comandos (conforme mencionado acima).
A seguir estão minhas configurações;
Meu /etc/sudoers
root ALL=(ALL) ALL
apache ALL=(ALL) NOPASSWD: ALL
%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL
Como tentei algumas combinações com sudoer e httpd.conf, o recente httpd.conf se parece com o seguinte;
meu httpd.conf
User apache
Group wheel
meu script PHP
exec("service network start", $a);
print_r($a);
exec("sudo -u root service network start", $a);
print_r($a);
Saída
Array
(
[0] => Bringing up loopback interface: [FAILED]
[1] => Bringing up interface eth0: [FAILED]
[2] => Bringing up interface eth0_1: [FAILED]
[3] => Bringing up interface eth1: [FAILED]
)
Array
(
[0] => Bringing up loopback interface: [FAILED]
[1] => Bringing up interface eth0: [FAILED]
[2] => Bringing up interface eth0_1: [FAILED]
[3] => Bringing up interface eth1: [FAILED]
)
Sem nenhuma surpresa, quando invoco a reinicialização dos serviços de rede via ssh, usando um usuário semelhante como o apache, o comando é executado com sucesso. É tudo uma questão de acessar esses comandos via protocolo HTTP. Tenho certeza de que o tipo de software cPanel/Plesk usa algo como sudoer ou algo assim e o que estou tentando fazer é basicamente possível. Mas preciso da sua ajuda para entender qual peça está faltando?
Muito obrigado!
Responder1
Se você adotar a solução de troyengel de lançar uma entrada na tabela cron raiz e modificá-la um pouco, poderá ter uma solução viável.
Se você absolutamente precisa usar o Apache para sinalizar uma reinicialização da interface, por que não fazer com que o PHP crie um arquivo que atue como um sinalizador e, em seguida, faça com que seu cronjob raiz que é executado a cada minuto (ou o que quer que seja) verifique a existência desse sinalizador. Se existir, reinicie as interfaces. Se não, morra. (lembre-se de fazer com que o cronjob remova o sinalizador após reiniciar a interface com sucesso).
Isso atinge o objetivo (reiniciar a interface, acionada a partir do Apache/php) e contorna todos os possíveis problemas envolvidos na concessão de acesso de nível raiz a um serviço de web/script.
Responder2
Você terá que escrevê-los como ferramentas orientadas por linha de comando PHP (certifique-se de que o pacote php-cli esteja instalado via yum) e, em seguida, execute-os diretamente no crontab raiz, não como um usuário normal. Você provavelmente também deseja escrevê-lo em um script básico bash (shell), usar php seria um exagero se você estivesse apenas executando comandos via exec().
Responder3
Você deve invocar os comandos necessários para executar como um usuário diferente usando sudo
-- e definir o sudoers
arquivo de configuração apropriadamente para que o usuário que executa o script PHP tenha permissão para executar os scripts como o outro usuário. Veja sudoers
(5) e cerca de uma dúzia de perguntas anteriores sobre o uso do sudo.
Responder4
você pode usar o sticky bit para fazer um script de shell ser executado como root. no entanto, fazer isso é um pouco mais complicado.
No entanto, você não pode simplesmente configurar um script de shell. Você precisa criar um executável regular com, digamos, C/C++, algo que não chame um intérprete como os scripts de shell fazem, e fazer com que execute o script de shell.