Não é possível fazer o computador reinicializar via script

1

Eu preciso reiniciar um sistema embarcado por meio de uma página da Web da rede local (um script CGI). Eu tenho a página construída e chama um script na estação (que é o host (apache) da página da Web). Este script deve apenas chamar o comando reboot, mas ele falha.

Uma tentativa foi esta:

 #!/bin/bash

 sudo reboot

Funcionou quando correu a partir da linha de comando, enquanto telnetado, mas não quando chamado pelo CGI. O erro (de /var/log/apache2/error.log ) foi:

sudo: no tty present and no askpass program specified

Ok, é justo. Eu tentei adicionar NOPASSWD ao arquivo sudoers para o usuário correto, mas sem charuto. Então eu tentei esse método, que eu encontrei online. Também funcionou quando executado a partir da linha de comando, mas não do servidor. Eu percebi que não receberia o mesmo erro, já que era através de telnet, e isso não aconteceu.

 #!/usr/bin/expect

 set name [lindex $argv 0]
 spawn telnet $name
 expect "login:"
 send "<user>\r"
 expect "Password:"
 send "Reformed\r"

 send "sudo reboot\r"

O erro foi:

malformed header from script. Bad header=ERROR!!: WebInterfaceReboot

(se eu codificar o IP no script, isso me dá o erro Bad header=spawn telnet 192.168.0.79 #: WebInterfaceReboot send: spawn id exp6 not open while executing "send "<username>\r"" (file ./reboot2.sh" line 9) )

Eu habilitei o logging do cgi no servidor, e o log CGI 'detalhado' não ajudou mais:

 %% [Wed Oct 09 09:24:25 2013] POST /cgi-bin/WebInterfaceReboot HTTP/1.1
 %% 500 /usr/lib/cgi-bin/WebInterfaceReboot
 %request
 Host: 192.168.0.79
 Connection: keep-alive
 Content-Length: 19
 Cache-Control: max-age=0
 Authorization: Basic aGhwOlJlZm9ybWVk
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 Origin: http:// 192.168.0.79
 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
 Content-Type: application/x-www-form-urlencoded
 DNT: 1
 Referer: http:// 192.168.0.79/cgi-bin/WebInterfaceReboot
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8

 RebootButton=Reboot
 %response
 ERROR!!

Note 'RebootButton' é o nome do botão pressionado na página para chamar o shell script

Tenho certeza que não é o script CGI real, como quando eu testei a primeira implementação, o script estava obviamente em execução. Quais alterações devo fazer, seja no script ou na instalação, para que o comando reboot possa ser executado dessa maneira?

    
por SSumner 09.10.2013 / 16:51

1 resposta

1

O servidor da Web é executado como um usuário diferente, é esse usuário que você deseja adicionar a sudoers . Para descobrir o nome do usuário do apache, execute este comando (saída do meu sistema, o seu deve ser semelhante):

$ ps aux | grep apache2
root     13108  0.0  0.0   9756   868 pts/0    S+   17:51   0:00 tail -f /var/log/apache2/error.log
root     15140  0.0  0.2 170752  9116 ?        Ss   20:10   0:00 /usr/sbin/apache2 -k start
www-data 15143  0.0  0.1 170752  5868 ?        S    20:10   0:00 /usr/sbin/apache2 -k start
www-data 15144  0.0  0.1 170752  5540 ?        S    20:10   0:00 /usr/sbin/apache2 -k start

Assim, o usuário do apache é www-data , você deve permitir que o usuário execute a reinicialização sem senha (isso não é uma boa ideia do ponto de vista da segurança, mas hey):

www-data ALL=NOPASSWD:/sbin/reboot
    
por 09.10.2013 / 20:16