2016-04-06 9 views
2

Ich habe viele Fragen gefunden, die dies tun, indem Sie große Lücken in den Berechtigungen öffnen oder die Benutzerrechte für Dateien ändern. Für meine aktuelle Anwendung ist keine von beiden eine Option. Was ich versuche, ist eine shell_exec oder ähnliche PHP-Funktion, um ein .sh-Skript in einem völlig anderen Ordner auf meinem System auszuführen, wenn eine Schaltfläche auf meiner Webseite angeklickt wird. . Das Skript muss aus dem Ordner ausgeführt werden soll es in der ich bin auf Debian und haben sudo installiert Apache Benutzer zu ermöglichen, durch das Hinzufügen dieser Zeilen den Befehl auszuführen:Wie führe ich ein Skript von einem Apache-Benutzer in einem nicht besessenen Ordner aus?

www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh start 
www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh stop 
www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh status 

Die run.sh ist nicht etwas, was ich bin erlaubt bearbeiten, so dass ich dies auf dem Apache-Ende verwalten muss, wenn möglich. Ich bin nicht berechtigt, die Berechtigungen oder den Besitz von run.sh zu ändern. Sie können also mein Dilemma sehen. Die PHP-Aufruf Ich benutze sieht wie folgt aus:

$test=shell_exec('cd /opt/folder/ && ./run.sh start&& cd -'); 

I $ test bin mit dem Ausgang von dem Befehl Echo. Hier wird es komisch. Es gibt eine gute Ausgabe von dem Befehl. Das Skript run.sh wird verwendet, um eine Liste anderer Programme zu starten und zu stoppen und deren Status anzuzeigen. Ich kann ./run.sh status laufen lassen und ein gutes Ergebnis zurück in der Variablen $ test erhalten. Wenn ich versuche ./run.sh stop es sagt, es hat funktioniert (Ich bin ziemlich sicher, dass das run.sh-Skript nicht viel Kontrolle eingebaut hat), aber dann passiert nichts wirklich auf dem System. Ich kann eine ps -ef | grep als eine Gesundheitscheck überprüfen und sehen alle Prozesse, die gestoppt werden sollten. Es ist das gleiche, wenn ich die ./run.sh start ausführen, aber es wird zurückgeben, dass keines der Programme gestartet wurde.

Also alles was gesagt wird, ich versuche nur herauszufinden, was ich falsch mache. Ich bin sicher, dass der PHP das Bash-Skript ausführt, aber aus irgendeinem Grund nicht in der Lage ist, einen der Start- oder Stoppbefehle im Skript auszuführen. Ich kann run.sh als root auch vollständig vom Betriebssystem ausführen. Ich bin wirklich am Ende meines Seils an diesem, so dass jede Hilfe sehr geschätzt wird. Wenn das nicht möglich ist, gibt es eine Alternative, die keine zusätzliche Programminstallation erfordert.

Antwort

0

Also nach ein paar weiteren Versuchen entschied ich mich, dies für später zu speichern. Ich erkannte, dass, obwohl ich dem Apache-Benutzer erlaubte, das Skript als root auszuführen, ich es ihm nicht wirklich gesagt hatte. Um dies zu beheben habe ich die Änderung

$test=shell_exec('cd /opt/folder/ && sudo ./run.sh start&& cd -'); 

Der zusätzliche sudo jetzt das Skript erzählt als root und die Einträge in visudo laufen lassen es so tun, ohne nach einem Passwort gefragt. Ich habe meine visodu-Datei geändert, um etwas abgespeckt zu werden, jetzt hat sie nur eine Zeile.

www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh

Das passt sowohl die Sicherheitsanforderungen und die Benutzereinschränkungen. Es sind fast keine Angriffsvektoren geöffnet, wie dies bei einem chmod 777 oder dergleichen der Fall wäre, und der Apache-Benutzer hat nur Zugriff auf das Skript run.sh mit den darin enthaltenen hartcodierten Parametern.

0

Ich habe vor Kurzem ein Projekt veröffentlicht, das es PHP ermöglicht, eine echte Bash-Shell zu erhalten und zu interagieren (als root, wenn gewünscht, aber ich glaube nicht, dass Sie es brauchen), es löst die Einschränkungen von exec() und shell_exec(). Erhalten Sie es hier: https://github.com/merlinthemagic/MTS

Nach dem Herunterladen Sie einfach den folgenden Code verwenden würde:

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', false); 
$return1 = $shell->exeCmd('cd /opt/folder/'); 
$return2 = $shell->exeCmd('./run.sh start'); 
$return3 = $shell->exeCmd('cd -'); 
//the return will be a string containing the return of the command 
echo $return1; 
echo $return2; 
echo $return3; 

Da Sie root nicht brauchen, gibt es eigentlich keine Sicherheitsprobleme ist. Wenn Sie das Paket installieren, überspringen Sie einfach den Teil bezüglich der Einrichtung von sudo.

Auch wenn Sie 'rennen.Es dauert eine ganze Weile, bis Sie fertig sind. Sie müssen das Timeout für diesen einen Befehl wie folgt ändern:

//is one hour enough? 
$timeout = 3600000; 
$return2 = $shell->exeCmd('./run.sh start', null, $timeout); 
Verwandte Themen