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?