Computer kann nicht per Skript neu gestartet werden

1831
SSumner

Ich muss ein eingebettetes System über eine lokale Netzwerkwebseite (ein CGI-Skript) neu starten. Ich habe die Seite erstellt, und es ruft ein Skript auf der Station (die (Apache) -Host der Webseite ist) auf. Dieses Skript soll lediglich den Neustartbefehl aufrufen, schlägt jedoch fehl.

Ein Versuch war folgender:

 #!/bin/bash  sudo reboot 

Es funktionierte, wenn es von der Befehlszeile aus ausgeführt wurde, während es eingeblendet wurde, aber nicht, wenn es vom CGI aufgerufen wurde. Der Fehler (von /var/log/apache2/error.log) war:

sudo: kein tty vorhanden und kein askpass-Programm angegeben

Okay, fair genug. Ich habe versucht NOPASSWD, die Sudoers-Datei für den richtigen Benutzer hinzuzufügen, aber keine Zigarre. Also habe ich diese Methode ausprobiert, die ich online gefunden habe. Es funktionierte auch, wenn es von der Befehlszeile aus ausgeführt wurde, jedoch nicht vom Server. Ich dachte, ich würde nicht den gleichen Fehler bekommen, da es über Telnet ging und es nicht tat.

 #!/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" 

Der Fehler war:

fehlerhafter Header aus Skript. Ungültiger Header = FEHLER !!: WebInterfaceReboot

(Wenn ich die IP-Adresse im Skript hartcodiere, wird der Fehler angezeigt. 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))

Ich habe die CGI-Protokollierung auf dem Server aktiviert, und das "detaillierte" CGI-Protokoll half nicht mehr:

 %% [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!! 

Hinweis 'RebootButton' ist der Name der Schaltfläche, die auf der Seite gedrückt wurde, um das Shell-Skript aufzurufen

Ich bin mir ziemlich sicher, dass es nicht das eigentliche CGI-Skript ist. Als ich die erste Implementierung getestet habe, lief das Skript offensichtlich. Welche Änderungen sollte ich am Skript oder an der Installation vornehmen, damit der Neustartbefehl auf diese Weise ausgeführt werden kann?

1
Funktioniert es nicht mit "sudo reboot" oder "sudo shutdown -r now", wenn Sie den Apache-Benutzer zu sudoers hinzufügen und ihn "shutdown" ohne Kennwort ausführen lassen? Ich weiß, dass Sie etwas Ähnliches versucht haben, aber ich kann nicht sagen, ob Sie den richtigen Benutzer zu sudoers hinzugefügt haben. Welcher Benutzer ist Ihr Webserver? terdon vor 11 Jahren 0
@terdon - Ich habe versucht, 'hhp' hinzuzufügen, was für fast alles der Benutzer ist. Wie bestätige ich den Apache-Benutzer? SSumner vor 11 Jahren 0
`ps aux | grep apache2`, sollte es einen Prozess geben, der von 'root' und einigen anderen von 'www-data' ausgeführt wird. Sie möchten die "www-Daten". terdon vor 11 Jahren 0
@terdon - also muss ich den Benutzer "www-data" zur sudoers-Datei mit NOPASSWD zum Neustart hinzufügen? SSumner vor 11 Jahren 0
Ja, das sollte es tun. terdon vor 11 Jahren 1

1 Antwort auf die Frage

1
terdon

Der Webserver wird als anderer Benutzer ausgeführt. Dieser Benutzer möchten Sie hinzufügen sudoers. Um den Apache-Benutzernamen herauszufinden, führen Sie diesen Befehl aus (Ausgabe von meinem System, Ihr sollte ähnlich sein):

$ 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 

Der Apache-Benutzer ist also www-data, Sie sollten diesem Benutzer gestatten, einen Neustart ohne Kennwort auszuführen (dies ist aus Sicherheitsgründen keine sehr gute Idee, aber hey):

www-data ALL=NOPASSWD:/sbin/reboot 
Die Sicherheit sollte in Ordnung sein - es ist in einem geschlossenen Netzwerk und die Website ist bereits passwortgeschützt SSumner vor 11 Jahren 0
Ich werde akzeptieren, weil ich denke, dass dies der richtige Weg war, aber ich habe das CGI so geändert, dass ich einfach den Befehl zum Neustart des Systems (`system (sudo reboot);`) aufrief, von dem ich dachte, ich hätte es früher ausprobiert SSumner vor 11 Jahren 0
@SSumner, es funktioniert, weil du Sudoers mit 'www-data' versehen hast, oder? terdon vor 11 Jahren 0
ja, ich glaube schon SSumner vor 11 Jahren 0