Anfängerproblem reboot



  • Höchstwahrscheinlich ist die Frage ziemlich banal, desahlb möchte ich erwähnen das ich mich halb tot-gegooglet habe und wirklich einfach nur feststecke:
    Ich arbeite mit Busybox aber meine Frage ist so grundlegen, dass distributionen hier wahrscheinlich keine rolle spielen dürften(wenn nich bitte korrigieren, wies in der Überschrift schon steht:Anfänger!!)

    also:
    alles was ich realisieren will ist den reboot befehl von einem c-programm(welches als cgi auf dem gerät liegt, um selbiges remote über den browser zu steuern) aus aufzurufen(in der Konsole klappt alles wunderbar)....
    in der art wie:

    system("/sbin/reboot");
    

    ...nur leider funktioniert das halt nich...nix tut sich und das apache error_log gibt auch nich mehr her als:
    [Sat Jan 01 00:56:08 2000] [error] [client xxx.xxx.xxx.xxx] reboot: , referer: http://xxx.xxx.xxx.xxx/restart.cgi
    [Sat Jan 01 00:56:08 2000] [error] [client xxx.xxx.xxx.xxx] no, referer: http://xxx.xxx.xxx.xxx/restart.cgi
    ....das wars....
    das cgi welches den Aufruf ausführt hat natürlich die rechte um ausgeführt zu werden, testmäßig auch ersteinmal von alles und jedem.
    Später habe ich es auch mit dem SUID-bit versucht, damit das cgi(Besitzer:root)
    mit root-rechten ausgeführt wird.
    Das ergebnis blieb dass selbe.....
    Später habe ich erfahren, dass Programme die die system()-Funktion benutzen eher ein heikles thema sind....also umgedacht und auf exec-funktionen konzentriert.
    Bin bei execl hängengeblieben...dabei raus kam:

    execl("/sbin/","reboot",NULL);
    

    wirkte fast zu einfach um zu funktionieren und so war es dann auch...
    das apache error_log sagt gar nichts dazu und alles was ich von execl zurückbekam war errno: 13 sprich EACCES
    aber die rechte des cgi erlauben das ausführen und die search-permission auf sbin ist auch gesetzt....tja, und hier stehe ich nun und bitte um einen denkanstoß..
    danke schonmal im voraus



  • Du verwendest man: execl falsch!

    execl("/sbin/reboot","reboot",NULL);
    

    Aber lass dir einmal ausgeben, mit welcher uid das Programm ausgeführt wird. Vermutlich führt der Apache das als www-data oä aus! Ansonsten speicher dir einfach mal was reboot sagt

    (zB via system("/sbin/reboot 2>&1 > /tmp/reboot.txt"); )



  • Probiers mal mit shutdown -r now.



  • knivil schrieb:

    Probiers mal mit shutdown -r now.

    Das macht auch nichts anderes als reboot. Zumindest nichts, was hier interessant sein könnte.



  • Ja, aber reboot duerfte nur ein Skript sein, so dass es in Kombination mit execl nicht funktioniert.



  • knivil schrieb:

    Ja, aber reboot duerfte nur ein Skript sein, so dass es in Kombination mit execl nicht funktioniert.

    ~ # file =reboot
    /sbin/reboot: symbolic link to `halt'
     ~ # file =halt
    /sbin/halt: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.4.1, dynamically linked (uses shared libs), for GNU/Linux 2.4.1, stripped
    


  • Leider sitze ich grad an einer Windowsmaschine und kann grad nicht schauen, was mein RedHat 8 (jaja, das ist etwas in die Tage gekommen) so hat. Aber ich erinnere mich an ein Skript, dass shutdown aufruft.



  • Danke ersteinmal für die vielen Ratschläge
    also:

    @rüdiger:

    execl("/sbin/reboot","reboot",NULL);
    

    schlägt gründlich fehl, apache error2_log sagt:
    [Sat Jan 01 04:52:37 2000] [error] [client xxx.xxx.xxx.xxx] reboot: , referer: http://xxx.xxx.xxx.xxx/restart.cgi
    [Sat Jan 01 04:52:37 2000] [error] [client xxx.xxx.xxx.xxx] no, referer: http://xxx.xxx.xxx.xxx/restart.cgi
    [Sat Jan 01 04:52:37 2000] [error] [client xxx.xxx.xxx.xxx] , referer: http://xxx.xxx.xxx.xxx/restart.cgi
    [Sat Jan 01 04:52:37 2000] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: restart2.cgi, referer: http://xxx.xxx.xxx.xxx/restart.cgi

    und der browser gibt mir den dazugehörigen 500 Internal Server Error...
    Deine Variante hatte ich auch schon öfters gelesen...mit

    execl("/sbin/","reboot",NULL);
    

    gibt er halt wenigstens nen errno zurück, und verursacht halt keinen Internal Server Error oder Premature end of script headers

    zu deinem 2. Vorschlag: Ich hab mir mit ps ax die Prozesse ausgeben lassen, aber mein cgi dort nicht gefunden(???), Oder meintest du das jetzt anders(wie gesagt linux-anfänger 😕 )

    @ knivil:
    Jo, das is so einer der Tücken von busybox....shutdown gibt es schlichtweg nicht.....kein scheiß...hab mich totgesucht

    /sbin/reboot is auch nur nen link auf /bin/busybox
    lrwxrwxrwx 1 root root 12 Dec 15 2008 reboot -> /bin/busybox
    da kann man nix machen..
    ich bin auf reboot angewiesen...halt gibt es noch, is aber wie reboot nurn link auf busybox...ich will das Gerät wie gesagt aber neu starten und nicht herunterfahren(halt verhält sich hier eh etwas eigenartig)

    Wie ihr merkt sind mir hier echt die Ideen ausgegangen...gibt es eventuell eine alternative zu system() und execl() oder eine ganz verrückte andere methode shellbefehle aus c/c++ aufzurufen...wie gesagt in der konsole eingegeben funktioniert reboot einwandfrei...aber was errorlog und entsprechende funktionen zurückgeben hab ich ja oben schon beschrieben...

    Hilfe!!!



  • Ich halte - wie rüdiger - die Variante mit den Zugriffsrechten für am wahrscheinlichsten, check das doch bitte mal.


Anmelden zum Antworten