• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Linux befehle über Website aktivieren?

P

Prankson

Guest
Moin,

ich hab mal ne Frage.

Und zwar. Ist es möglich Linux befehle (wie zb. apt-get update) über eine Website ausführen zu lassen?
Ich bin nämlich gerade dabei ein kleines Admin Panel zu erstellen. Das wäre echt geil wenn man den Linux Server einfach darüber updaten könnte...

MFG!
 
Werbung:
Mit PHP und auch anderen Programmiersprachen kann man lokale Befehle ausführen. Bei PHP wäre das z.B. mit exec, shell_exec etc. möglich.

Allerdings wird das lokale Programm dann mit den Nutzerrechten aufgerufen die dem vhost der Webseite zugeordnet sind. Dadurch ist man in den Möglichkeiten eingeschränkt - was auch gut so ist. Wenn Du root-Befehle ausführen willst (was bei apt-get schon nötig wäre), dann müsstest Du die Zugriffsrechte des Webservers entsprechend aufbohren, die Sicherheitseinstellungen deines Servers untergraben oder eine eigene Anwendung schreiben, die eine Ausgabe im Browser bereitstellt aber als root läuft (die Serverwaltungssoftware webmin macht das z.B. so).
 
Hättest du vielleicht mal ein wenig Code für mich? Damit ich das mal testen kann.
 
Werbung:
Meine Struktur:

Ich habe meine Website (Das Admin Panel mit dem ich den Server anspreche) bei lima-city.de
Der Server der von dem Panel angesprochen wird, ist ein Debian 8 vServer von OVH.de .

Also möchte ich nicht den lokalen Webserver anpingen, sondern einen "externen".

Wie wäre der Code für zb. einen Restart Button?
 
Man kann auch eval nehmen. Ein Problem sind immer ein wenig Kommandos mit Strings, weil du die in eine <textarea> eingeben musst und dann im PHP aus dem $_POST in einen String einlesen musst. Also so Konstrukte wie
Code:
echo "Wert:  $a['x']";
Musst eventuell vorher parsen und die Sonderzeichen entsprechend korrigieren. Ich habe mal was geschrieben, was auf PHP exec bzw shell_exec basiert, aber so richtig funktioniert das nicht, weil ich die Kommandos noch nicht parse. Außerdem mache ich einen Include, daher fehlen beim Beispiel alle HTML Header / Footer Daten. alles ohne Gewähr.

Code:
<style type="text/css" scoped>
    li { margin: 5px; }
    .server_output_text {
        background-color:black; color:white;
        max-width:800px; margin:0 auto;
        max-height:500px;
        font-family: monospace; white-space:pre;
        padding:5px;
        overflow-x: scroll; overflow-y: scroll;
    }
    .server_output_head { font-weight:bold; color:yellow; }
 
</style>
<script type="text/javascript">
    function checkInput() {
        sCmd = document.getElementById('RemCommand').value;
        if (sCmd == '') {
            sErrText = "<div class='bg-danger' style='padding:3px'><strong>FEHLER:</strong> Es wurde kein Kommando eingegeben. </div>";
            document.getElementById('fehlerText').innerHTML = sErrText;
            return(false);
        }
        return(true);
    }
</script>

<?php
 
    define( "MAXTIME", 20);  //mehr als 20 sekunden soll das Skript nicht brauchen

    $isWindows = strstr(strtoupper(PHP_OS), strtoupper("Win"));

    //Wir wollen dieses Skript rekursiv aufrufen und die Zeit beschränken
    if (!( $sScriptName = substr(strrchr($_SERVER['SCRIPT_NAME'], SLASH),1))) $sScriptName = $_SERVER['SCRIPT_NAME'];
    set_time_limit(MAXTIME);

    $CmdPrefix  = StripSlashes(HTML_get_request_field('CmdPrefix'));
    $RemCommand = StripSlashes(HTML_get_request_field('RemCommand'));
    $cbxPrefix  = (HTML_get_request_field('cbxPrefix'))   ? "checked='checked'"  : '';
    $cbxVardump = (HTML_get_request_field('cbxVardump'))  ? "checked='checked'"  : '';
    $phpCommand = HTML_get_request_field('phpCommand');
    if ($phpCommand == 'shell_exec') {
        $radioShellExec = "checked='checked'";
        $radioExec      = "";
    } else {
        $phpCommand = 'exec'; //default
        $radioShellExec = "";
        $radioExec      = "checked='checked'";
    }
    $FirstCall  = (HTML_get_request_field('FirstCall'))  ? false : true;
    if ($FirstCall) $CmdPrefix  = ($isWindows) ?  "cmd /c" : LEER;   
    echo "<div class='jumbotron'><h1>" . menuGetPageTitle(false) . "</h1></div>";

if ( $FirstCall ) { /******* Sonst nur einen einfachen Text ausgeben *******/  ?>

<div class="row"> 
    <div class="col-sm-1 col-sm-offset-1">
        <img class="img-responsive" src="http://NetAktiv.de/images/stop_klein.gif" alt="Stopp">
    </div>
    <div class="col-sm-8">
        <p>Bei dem Ausf&uuml;hren der Kommandos sind verschiedene Dinge zu beachten:</p>
        <ul>
            <li>Die Ausf&uuml;hrung erfolgt im Kontext des Web-Servers, fehlende Privilegien k&ouml;nnendie Durchf&uuml;hrung verhindern.</li>
            <li>Man darf keine Kommandos eingeben, die eine Eingabe des Benutzers erwarten, dann h&auml;ngt der Vorgang.</li>
            <li> 
                Bei manchen Betriebssystemen wie Windows muss zumindest vor internen Kommandos
                (wie Dir) der Kommandoointerpreter aufgerufen werden, der nach der Ausf&uuml;hrung aber die
                Kontrolle wieder an den rufenden Prozess gibt (unter Windows NT/2000 lautet das Kommando
                dann zum Beispiel <code>cmd /c dir</code> (statt nur dir)
            </li>
            <li>
                Einige wenige Kommandos, die doch nur eine einfache Eingabe erwarten, kann man Aufrufen
                indem man die Eingabe mittels Pipe &uuml;bergibt, Beispiel (Windows NT)
                <code>cmd /c echo. | date</code>
            </li>
            <li>Will man mehrere Kommandos ausf&uuml;hren, so muss man ein Skript hochladen (eventuell sp&auml;tere Version).</li>
            <li>Die Form erlaubt, vor jedem Kommando ein festes Prefix einzuf&uuml;ge (beispielsweise <code>cmd /c</code>).</li>
            <li>Unter Linux/Unix findet man durch Eingabe von <code>df -kl</code> alle Festplatten.</li>
            <li>Wir haben die beiden PHP shell Befehle <code>exec</code> und <code>shell_exec</code> implementiert, für die Unterschiede siehe
                beispielweise <a href="http://stackoverflow.com/questions/7093860/php-shell-exec-vs-exec">php-shell-exec-vs-exec</a>
                bei stackoverflow. Beim Befehl <code>exec</code> erfolgt die Ausgabe in ein Array, dessen Inhalt kann optional auch als var_dump ausgegeben werden.
            </li>
        </ul> 
        <hr class="hr-rr-def"/>
    </div>
</div>

<?php } /******* Ende der Ausgabe der Hilfe bei FirstCall *******/ ?>

<form class="form-horizontal" method="POST" action="<?php echo $sScriptName ?>" onsubmit="return(checkInput());">
    <input type="hidden" name="FirstCall" value="FALSE"/>
    <input type="hidden" name="page"      value="server_cmd" />
    <div class="form-group">
        <label class="col-sm-1 col-sm-offset-2">Exec:</label>
        <div   class="col-sm-2">
            shell_ecec&nbsp;<input type="radio" name="phpCommand" value="shell_exec" <?php echo $radioShellExec; ?> />&nbsp;&nbsp;
            <input type="radio" name="phpCommand" value="exec" <?php echo $radioExec; ?> />&nbsp;exec
        </div>
        <div   class="col-sm-2"><input type="checkbox" id="cbxVardump" name="cbxVardump" value="ON" <?php echo $cbxVardump; ?>/>&nbsp;var_dump</div>
    </div>
    <div class="form-group">
        <label class="col-sm-1 col-sm-offset-2" for="CmdPrefix">Prefix:</label>
        <div   class="col-sm-2"><input class="form-control input-sm" type="text" name="CmdPrefix" <?php echo 'value="' . $CmdPrefix . '"'; ?>/></div>
        <div   class="col-sm-2"><input type="checkbox" id="cbxPrefix" name="cbxPrefix" value="ON" <?php echo $cbxPrefix; ?>/>&nbsp;verwenden</div>
    </div>
    <div class="form-group">
        <label class="col-sm-1 col-sm-offset-2" for="RemCommand">Cmd $:</label>
        <div   class="col-sm-4"><input class="form-control input-sm" type="text" id="RemCommand" name="RemCommand" value="<?php echo $RemCommand; ?>"/></div>
        <div   class="col-sm-2"><input type="submit" value="Ausführen" name="B1" class="btn btn-default btn-sm"/></div>
     </div>
    <div class="form-group">
        <div   class="col-sm-5 col-sm-offset-3" id="fehlerText"></div>
     </div>
</form>

<!-- Ausgabe des Kommandos -->
<?php
 
    if ($RemCommand) {
        if (($cbxPrefix) && ($CmdPrefix)) $RemCommand = $CmdPrefix . BLANK . $RemCommand;
        /******* Ausgabe und Ausführung nur wenn ein Kommando übergeben wurde *******/

        echo "<div class='server_output_text'>";
        echo "<span class='server_output_head'>PHP $phpCommand Command\$: $RemCommand</span>\n\n";
        if ($radioShellExec) {
            echo shell_exec( $RemCommand);
        } else {
            $iResult = 0;
            if (exec( $RemCommand, $sArrResult, $iResult)) echo implode("\n", $sArrResult);
            $sError = ( $iResult != 0 ) ? "FEHLER (Code $iResult)" : "OK";
            echo "\n\n<span class='server_output_head'><strong>Status: </strong> $sError</span>";
            if ($cbxVardump) echo "\n\n<span class='server_output_head'>Ausgabe von var_dump:</span>\n" . print_r($sArrResult, true);
        }
        echo "</div>";
     
    }
 
?>
 
Werbung:
Hier mal mein Output auf PING mit den richtigen Styles und Parametern (wie use prefix cmd unter Win)
 

Anhänge

  • ping.jpg
    ping.jpg
    43,4 KB · Aufrufe: 6
Also möchte ich nicht den lokalen Webserver anpingen, sondern einen "externen".

Wie wäre der Code für zb. einen Restart Button?

Ein ping auf einen anderen Server zu machen ist eine einfache Sache die dir hier bereits erklärt wurde. Einen Restart-Button zu bauen ist jedoch schwieriger. Damit man einen Server neu starten kann muss man lokal an diesem angemeldet sein. Das wäre z.B. möglich wenn Du auf dem externen Server eine SSH-Login einrichtest auf dem Du dich aus der Ferne anmelden kannst (dazu muss der Server auf dem die Webseite läuft jedoch auch SSH-Verbindungen zu externen Servern ermöglichen) oder du baust dir eine Anwendung die auf dem neuzustartenden Server läuft, die du dann von extern (z.B. über einen spezifischen Port) ansprichst und dadurch den Neustart auslöst. Beide Wege stellen jedoch ein gewisses Sicherheitsrisiko für diesen Server war, da jemand der diesen Weg entdeckt die Kontrolle über deinen Server übernehmen könnte.
 
Zurück
Oben