it-swarm.com.de

sudo in php exec ()

Ich weiß nicht was der Deal hier ist…

Ich möchte also ein Applescript ausführen: Sudo osascript myscript.scpt

Das funktioniert gut im Terminal, aber nicht, wenn ich es über PHP exec() ausführe. nichts passiert. Die Konsole sagt 

no tty present and no askpass program specified ; TTY=unknown ; …

Ich habe meine Nachforschungen durchgeführt und es scheint, dass mir das Kennwort für den Befehl Sudo fehlt. Ich habe verschiedene Möglichkeiten ausprobiert, um dies zu umgehen, einschließlich:

  • %admin ALL=(ALL) ALL in /etc/sudoers schreiben
  • und proc_open() anstelle von exec()

nichts von dem scheint zu funktionieren, was mich in den Wahnsinn treibt.

Gibt es im Grunde eine klare Möglichkeit, PHP einen einfachen Terminalbefehl auszuführen?

BEARBEITEN: Zur Verdeutlichung ist myscript.scpt ein einfaches AppleScript, das die Bildschirmbenutzeroberfläche (für ein größeres Projekt) ändert. Theoretisch sollte einfach osascript myscript.scpt ausreichen, jedoch ist Sudo aus irgendeinem Grund erforderlich etwas Antwort vom System. Wenn Sudo irgendwie beseitigt werden könnte, glaube ich nicht, dass ich dieses Berechtigungsproblem hätte.

38
pop850

Wenn jemand das noch braucht. Sie können eine Nur-Text-Datei schreiben, z. B. ~ ./. Sudopass/sudopass.secret , mit dem Root-Kennwort. Nehmen wir an, das Root-Passwort lautet '12345'. Sie erstellen ~ ./. Sudopass/sudopass.secret mit nur '12345' als Inhalt:

12345

Und dann machst du Folgendes:

exec('Sudo -u root -S {{ your command }} < ~/.sudopass/sudopass.secret');

Denken Sie daran, dies nur in kontrollierten Umgebungen zu verwenden.

17
scabezas

Es klingt, als müssten Sie Sudo ohne Passwort einrichten. Versuchen:

%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt

Kommentieren Sie auch die folgende Zeile aus (in/etc/sudoers via visudo), falls vorhanden:

Defaults    requiretty
15
tomit

Ich denke, Sie können mit visudo einen bestimmten Zugriff auf Benutzer und Befehle bringen, etwa wie folgt:

nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt

und mit PHP:

@exec("Sudo /path/to/osascript myscript.scpt ");

angenommen, nobody Benutzer führt Apache aus.

8
Ezequiel Hdez.

php: Die bash-Konsole wird erstellt und führt das erste Skript aus, das Sudo zum zweiten aufruft, siehe unten:

$dev = $_GET['device'];
$cmd = '/bin/bash /home/www/start.bash '.$dev;
echo $cmd;
Shell_exec($cmd);
  1. /home/www/start.bash

    #!/bin/bash
    /usr/bin/Sudo /home/www/myMount.bash $1
    
  2. myMount.bash:

    #!/bin/bash
    function error_exit
    {
      echo "Wrong parameter" 1>&2
      exit 1
    }
    ..........
    

sie möchten ein Skript von der Root-Ebene aus ohne Root-Berechtigungen ausführen. Erstellen und ändern Sie die Datei /etc/sudoers.d/mount:

www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash

vergiss nicht chmod:

Sudo chmod 0440 /etc/sudoers.d/mount
4
lisu

Führen Sie den Befehl Sudo visudo aus und setzen Sie -%Sudo ALL=(ALL:ALL) auf %Sudo ALL=(ALL:ALL) NOPASSWD: ALL, damit es funktioniert.

1

Ich hatte eine ähnliche Situation, als ich exec() einen Backend-Befehl versuchte und no tty present and no askpass program specified im Fehlerprotokoll des Webservers abrief. Ursprünglicher (schlechter) Code:

$output = array();
$return_var = 0;
exec('Sudo my_command', $output, $return_var);

Ein bash-Wrapper hat dieses Problem behoben, wie zum Beispiel:

$output = array();
$return_var = 0;
exec('Sudo bash -c "my_command"', $output, $return_var);

Nicht sicher, ob dies in jedem Fall funktioniert. Stellen Sie außerdem sicher, dass Sie die entsprechenden Quotierungs-/Escape-Regeln für den my_command-Teil anwenden.

0
Balage

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 exec () oder Shell_exec () auszuführen. Bitte lesen Sie diesen Link für genauere Informationen.

          • killProcess.php
0

Ich habe kürzlich ein Projekt veröffentlicht, mit dem PHP eine echte Bash-Shell erhalten und mit ihr interagieren kann. Laden Sie es hier herunter: https://github.com/merlinthemagic/MTS .__ Die Shell hat ein Pty (Pseudo-Endgerät, wie Sie es zB in einer SSH-Sitzung hätten), und Sie können die Shell erhalten als root wenn gewünscht. Sie sind nicht sicher, dass Sie root benötigen, um Ihr Skript auszuführen, aber wenn Sie Sudo erwähnen, ist es wahrscheinlich.

Nach dem Download würden Sie einfach den folgenden Code verwenden:

$Shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $Shell->exeCmd('/path/to/osascript myscript.scpt');
0
MerlinTheMagic