2010-07-03 6 views
36

Ich weiß nicht, was das Geschäft hier ist ...sudo in PHP exec()

Deshalb möchte ich ein Applescript auszuführen: sudo osascript myscript.scpt

Dies funktioniert im Terminal in Ordnung, aber nicht, wenn ich es ausführen über PHP's exec(); nichts passiert. Die Konsole sagt

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

ich meine Forschung getan hat, und es scheint, ich bin das Passwort für den sudo Befehl fehlt. Ich habe versucht, ein paar verschiedene Möglichkeiten, dies zu umgehen, einschließlich:

  • %admin ALL=(ALL) ALL in /etc/sudoers
  • und proc_open() statt exec()

von denen keine zu schreiben scheinen folglich zu arbeiten, mich verrückt!

Also gibt es im Grunde eine klare Möglichkeit, um PHP einen einfachen Terminal-Befehl ausführen zu lassen?

EDIT: Um zu klären, ist myscript.scpt ein einfaches Applescript, die in der Online-Änderungen an der Benutzeroberfläche (für ein größeres Projekt). In der Theorie sollte einfach osascript myscript.scpt genug sein, aber die sudo ist aus irgendeinem Grund notwendig, einige Antwort vom System aufzurufen. Wenn die sudo irgendwie beseitigt werden könnte, glaube ich nicht, dass ich dieses Erlaubnisproblem haben würde.

+5

Es gibt Möglichkeiten, dies zu beheben, aber der beste Weg ist wahrscheinlich zu machen, dass "myscript.script" ohne Root-Rechte ausgeführt wird. – Stephen

+6

Irgendwie ist das technisch eine schlechte Idee. Entweder geben Sie PHP Zugriff auf sudo, ohne ein Passwort zu benötigen, oder Sie verwenden ein setuid-Hilfsskript, das immer mit root-Rechten ausgeführt wird. Keiner ist bei einem PHP-Frontend ziemlich gesund. Können Sie Ihre Frage aktualisieren, um uns zu sagen, was "myscript.scpt" tatsächlich leistet? –

+0

Frage aktualisiert – pop850

Antwort

-1

Wie wäre es mit dem Ausführen des PHP-Skripts mit sudo, und es im Skript weglassen? Das könnte auch für Berechtigungen für untergeordnete Prozesse sorgen.

+0

leider ist das Programm web-basiert, so dass PHP durch einen Befehl von einem Remote-Benutzer – pop850

+4

@ pop850 - Mmkay ausgeführt wird. In diesem Fall würde das Ausführen des PHP-Skripts mit 'sudo 'bedeuten, Apache mit' sudo' laufen zu lassen - oder einfach Apache-Root-Fähigkeiten zu gewähren. Es klingt gefährlich, aber andererseits, Apache zu erlauben, sudo ohne ein Kennwort aufzurufen, ist * genau * als gefährlich. Wirklich, du solltest wahrscheinlich nicht tun, was du tust, wie du es machst. Kannst du Apache einfach die Erlaubnis erteilen, die Aktion auszuführen, ohne Root-Zugriff zu benötigen? Das sollte auf jeden Fall möglich sein, es sei denn, Apache verändert das System irgendwie, was es nicht tun sollte *. – Matchu

+0

genau wie würde ich Apache Root-Fähigkeiten gewähren? Ich habe versucht '% apache ALL = (ALL) NOPASSWD: ALL' – pop850

14

Es klingt wie Sie brauchen, um Passwordless Sudo einzurichten. Versuchen:

%admin ALL=(ALL) NOPASSWD: ALL 

Auch kommentieren Sie die folgende Zeile aus (in/etc/sudoers über visudo), wenn es da ist:

Defaults requiretty 
+0

Ich habe versucht, dies zu etc/sudoers hinzuzufügen, aber keine Würfel. Ich bekomme immer noch "no tty present und kein askpass-Programm angegeben" – pop850

+0

Ich habe meine Antwort aktualisiert. – tomit

+0

Hattest du ein Glück, die obligatorische Zeile zu kommentieren? – tomit

18

Wenn jemand noch dies erfordert. Sie können eine einfache Textdatei schreiben, zB ~ ./. Sudopass/sudopass.secret, mit dem root-Passwort dort. Nehmen wir an, das Root-Passwort lautet '12345'. Sie erstellen ~ ./ sudopass/sudopass.secret mit nur '12345' als Inhalt.

12345 

Und dann haben Sie die folgenden Schritte aus:

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

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

+0

Hinweis: nicht die {{&&}} –

+6

omg. VERLASSEN SIE KEINE PASSWÖRTER! @tomits Antwort ist viel sicherer. Siehe auch http://StackOverflow.com/a/3166174/125525 – cmroanirgo

4

php: die Bash-Konsole erstellt, und es führt erstes Skript, das sudo zum zweiten aufrufen, finden Sie unter:

$dev = $_GET['device']; 
$cmd = '/bin/bash /home/www/start.bash '.$dev; 
echo $cmd; 
shell_exec($cmd); 
  1. /home/www/starten.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 
    } 
    .......... 
    

oc, die Sie wollen, ohne Root-Rechte Skript von Root-Ebene ausgeführt werden, dass erstellen zu tun und Ändern Sie die Datei /etc/sudoers.d/mount:

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

vergessen Sie nicht zu chmod:

sudo chmod 0440 /etc/sudoers.d/mount 
3

Ich glaube, Sie gezielten Zugriff auf Benutzer und Befehl mit visudo so etwas wie dieses bringen kann:

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

und mit php:

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

angenommen nobody Benutzer läuft Apache.

+0

Ich habe viele Lösungen versucht, diese funktioniert am besten für mich: +1: – MitchellK

0

Ich habe kürzlich ein Projekt veröffentlicht, das es PHP ermöglicht, eine echte Bash-Shell zu erhalten und mit ihr zu interagieren. Holen Sie es hier: https://github.com/merlinthemagic/MTS Die Shell hat eine Pty (Pseudo-Terminal-Gerät, das gleiche wie Sie in einer SSH-Sitzung haben würde), und Sie können die Shell als Root, wenn gewünscht. Nicht sicher, dass Sie root benötigen, um Ihr Skript auszuführen, aber wenn Sie sudo erwähnen, ist es wahrscheinlich.

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

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

Run sudo visudo Befehl dann -%sudo ALL=(ALL:ALL)-%sudo ALL=(ALL:ALL) NOPASSWD: ALL gesetzt wird es funktionieren.