it-swarm.com.de

Wie rufe ich ein Shell-Skript von PHP auf, das SUDO benötigt?

Ich habe eine Datei, die ein Bash-Skript ist, für das Sudo funktionieren muss.

Ich kann es von der Kommandozeile aus mit Sudo ausführen, aber ich werde aufgefordert, das Sudo-Passwort einzugeben.

Ich möchte dieses Skript von PHP über Shell_exec ausführen, aber wenn ich Sudo anrufe, ist es nicht wie eine Befehlszeile, in der ich nach dem Kennwort gefragt werden kann. Gibt es eine Möglichkeit, das Kennwort für Sudo mit dem Sudo-Anruf zu übergeben?

Wie kann ich das machen?

43
JD Isaacks

Bearbeiten Sie die Sudoers-Datei (mit visudo) und fügen Sie eine Regel hinzu, mit der der Webserver-Benutzer den Befehl ohne Kennwort ausführen kann. Zum Beispiel:

www-data ALL=NOPASSWD: /path/to/script
42
Brian

Es gibt verschiedene Lösungen für dieses Problem.

  • Erwägen Sie zunächst, die Skriptberechtigungen zu ändern, wenn der Grund dafür, dass Sie Sudo möchten, einfach ein Berechtigungsproblem ist (siehe den Kommentar, den ich der obigen Frage hinzugefügt habe).

  • Ein anderer Ansatz wäre die Verwendung des setuid-Bits . [Bearbeiten: Sieht aus, als würde setuid mit Skripten nicht gut funktionieren. Erläuterungen finden Sie unter diesem Link .]

  • Eine dritte, aber sehr unsichere Methode besteht darin, das Passwort aus einer Passwortdatei zu lesen. Warnung: Dies ist sehr unsicher. Wenn es eine andere Möglichkeit gibt, tu es nicht. Versuchen Sie in diesem Fall, die Kennwortdatei irgendwo in Ihrer Ordnerhierarchie auszublenden.

    <?php
    Shell_exec('Sudo -u root -S bash script.sh < /home/[user]/passwordfile');
    ?>
    
  • Eine vierte Möglichkeit ist die Verwendung des NOPASSWD-Tags in der sudoers-Datei. Sie sollten diese Leistung auf die spezifischen Befehle beschränken, die Sie benötigen.

8
Danilo Bargen

Sie können so etwas zu Ihrer sudoers-Datei hinzufügen:

username ALL=NOPASSWD: /path/to/script

Dadurch kann dieser Benutzer Sudo für das betreffende Skript aufrufen, ohne dass Sie zur Eingabe eines Kennworts aufgefordert werden.

5
Daniel Egeberg

Die beste sichere Methode ist die Verwendung der Crontab. Speichern Sie alle Ihre Befehle in einer Datenbank, sagen Sie, mysql table und erstellen Sie einen cronjob, um diese mysql entreis zu lesen und über Shell_exec () auszuführen. Bitte lesen Sie diesen Link für genauere Informationen.

  * * * * * killProcess.php
0