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:
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?
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):
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