PHP-Skript kann kein Bash-Skript ausführen. sh: Erlaubnis verweigert

14

Ich versuche, ein .sh-Skript von PHP aus auszuführen, es wird jedoch nicht ausgeführt.

Ich habe die Fehlerprotokolle überprüft und erhalte den Fehler "sh: Permission denied". Ich habe überprüft, unter welchem ​​Benutzer PHP ausgeführt wird, und es wird unter dem Apache-Benutzer durchgeführt.

Ich habe versucht, den Besitz der .sh in den Apache-Benutzer zu ändern, aber es gibt kein Ergebnis.

Anfangs dachte ich, das liegt daran, dass sich das Skript außerhalb von www / dir befindet, aber selbst wenn ich das Skript in dasselbe Verzeichnis lege, wird der Fehler immer noch angezeigt.

Gibt es eine andere Lösung, als den Apache-Benutzer zur SUDOers-Liste hinzuzufügen?

Das sh-Skript läuft einwandfrei, wenn ich es mit dem Befehl 'php filename.php' von Putty aus starte.

Robin Presto
quelle
3
Ist es ein Shell-Skript oder eine PHP-Datei? Ihr letzter Absatz ist darüber nicht klar. Haben Sie auch die Ausführungsberechtigungen ( x) für die Datei festgelegt? Haben Sie den Script-Interpreter in einer Shebang-Zeile angegeben?
Daniel Beck
Es ist ein Bash-Skript, das mit PHP ausgeführt werden kann. Ja, ich habe es ausführbar gemacht und den Skriptinterpreter angegeben. Es funktioniert korrekt, wenn ich das PHP-Skript von Putty aus ausführe und das Bash-Skript aufgerufen wird und korrekt ausgeführt wird. Aber wenn ich stattdessen das PHP-Skript vom Webbrowser aus starte, schlägt das Ausführen des Bash-Skripts fehl und dieser Fehler tritt auf, da es als Apache-Benutzer und nicht als Benutzer ausgeführt wird, den ich in Putty verwende.
Robin Presto
1
Versuchen Sie es chmod 775 yourscript.sh. Dadurch erhalten r-x"Andere" Benutzer Berechtigungen zum Lesen und Ausführen dieser Datei.
Rhyuk,
Ich versuchte es. Kein Glück .. Ich kann den genauen Grund nicht bis morgen wissen. Ich habe von meinem Standort aus keinen Zugriff auf die Protokolle. Ich melde mich wieder bei euch. Danke für deine Hilfe. :)
Robin Presto

Antworten:

10

Versuchen Sie die folgenden Vorschläge:

  • Versuchen Sie, den folgenden Testbefehl auszuführen, und prüfen Sie, ob er funktioniert hat:
    • php -r "echo exec('whoami');"
  • Stellen Sie sicher, dass alle übergeordneten Verzeichnisse und die Dateien mindestens über r-xFlaggenberechtigungen verfügen :
    • chmod 755 dir; chmod 755 file
  • Stellen Sie sicher, dass der Eigentümer der Datei Ihr Apache-Benutzer ist .
    • Versuchen Sie auch, +sder Datei ein Flag (sudo) hinzuzufügen (nicht empfohlen):
      • chmod u+s file,
  • Stellen Sie sicher, dass Ihr PHP nicht in einem läuft safe_mode.
  • Stellen Sie sicher, dass sich das Skript in Ihrem Apache-Stammverzeichnis befindet:
    • Andernfalls verschieben Sie das Skript darin,
    • oder fügen Sie dieses Verzeichnis Ihrer Apache-Konfiguration hinzu,
    • oder fügen Sie dieses Verzeichnis zu Ihrem hinzu include_path, zB:
      • php.ini Datei: include_path ".:/usr/local/lib/php:/your/dir"
      • oder .htaccessDatei:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Überprüfen Sie, ob Ihre Shell /bin/shfür Ihren Apache-Benutzer gültig ist (z. B. mit:) finger.
  • Stellen Sie sicher, dass Sie php.ini: disable_functionsfor execfunction nicht verwenden
  • Bei der Verwendung von SELinux oder hat selinux-utilsinstalliert (ein Security-Enhanced Linux - System), prüfen getenforce/ setenforceKonfiguration , wie sie in beschrieben @Tonin Antwort.

Fehlerbehebung:

  • Wenn Sie Ihre php.inioder httpd.confDatei geändert haben, vergessen Sie nicht, den Webserver neu zu starten.
  • Überprüfen Sie Ihr Apache-Fehlerprotokoll auf weitere Details.
  • Aktivieren Sie in Ihrer php.inialler Art von Fehlern ( display_error, error_reportingusw.).
Kenorb
quelle
1
Das war mein Problem ... das übergeordnete Verzeichnis hatte keine Ausführungsrechte ... es funktioniert jetzt! Vielen Dank! :)
Robin Presto
Noch immer kein Glück für mich :( Irgendwelche Vorschläge? `` `[Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x. 27 root root 4096 3. September 12:31 / drwxrwxrwt. 4 root root 4096 3. September 15:45 / tmp -rwxr-xr-x. 1 root root 24. September 3 15:39 / tmp / sleep safe_mode = Off include_path = "/ tmp: / home / kiwi_build" ``
pihentagy
1
Argh, setenforce hat es gelöst. OMG
pihentagy
13

Ein solches Problem kann vom verwendeten Betriebssystem und der Konfiguration abhängen. Einige Linux-Distributionen (hauptsächlich solche, die auf RHEL basieren, wie CentOS oder Fedora) werden mit standardmäßig aktiviertem SELinux ausgeliefert. Dies kann mit den folgenden Befehlen überprüft und vorübergehend geändert werden:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

Sie können die aktuelle Konfiguration auch vollständiger anzeigen:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Diese Änderung kann dauerhaft vorgenommen werden, indem Sie die /etc/selinux/configDatei bearbeiten und die SELINUXVariable auf permissiveoder setzendisabled .

Aber der richtige Weg , um diese Art von Problem zu lösen , wenn Sie tatsächlich in dieser Situation sind, ist das überprüfen /var/log/audit/audit.logProtokolldatei. Es enthält alle Ereignisse, die sich auf SELinux-Regeln beziehen. Dann sollten Sie Ihrem Skript wahrscheinlich den richtigen Kontext geben, dh die Berechtigung, vom Apache / PHP-Benutzer ausgeführt zu werden. Das Überprüfen des SELinux-Sicherheitskontextes erfolgt mit ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

Diese Liste enthält den Benutzer, die Rolle und den Typ jeder Datei / jedes Verzeichnisses. Hier diehttpd_sys_script_exec_t gibt Typ den Dateien im cgi-Verzeichnis die Berechtigung, von httpd ausgeführt zu werden. Ihr Shell-Skript sollte wahrscheinlich denselben Typ haben.

Sie können die audit.logZeilen auch an den audit2allowBefehl übergeben. Sie erhalten die Änderungen, die erforderlich sind, um SELinux glücklich zu machen. In der Regel müssen die vorgeschlagenen Änderungen jedoch an der SELinux-Richtlinie selbst vorgenommen werden. Dies ist jedoch nicht das, was Sie in Ihrem Fall tun sollten.

Auf der folgenden Seite werden ein ähnliches Problem und verschiedene Lösungsmöglichkeiten beschrieben: http://sheltren.com/stop-disabling-selinux

Tonin
quelle
Vielen Dank für die ausführliche Antwort! Leider kann ich, wie ich bereits erwähnte, erst morgen root-Zugriff haben. Also melde ich mich auch bei dir! :) Und ja, ich benutze CentOS.
Robin Presto
Ich habe Ihre Antwort geliebt, sehr informativ! Leider habe ich Ihre nicht ausgewählt, da die Durchsetzung deaktiviert war und nicht das Problem war. Obwohl ich aus Ihrer Antwort viel gelernt habe, vielen Dank. Ich werde dich wählen, wenn ich genug Ansehen habe :)
Robin Presto
Keine Sorge, ich bin froh zu wissen, dass du von meinem Beitrag gelernt hast!
Tonin
Wenn erzwungen das Problem ist, dann ist es wirklich nicht offensichtlich, was zum Teufel los ist. Es hat meinen Tag gerettet!
Mittwoch,
1

Also bin ich hierher gekommen, nachdem ich auf Google nach einem ähnlichen Problem gesucht hatte. Ich dachte, der Kommentar zu SELinux wies mich in die richtige Richtung.

In meinem eigenen Fall habe ich ein benutzerdefiniertes Git-Bereitstellungsskript verwendet, das einen Shell-Befehl verwendet. Der Befehl funktioniert in BASH einwandfrei, hat dann aber "Berechtigung verweigert" und "kein Repository" auf Git. Das war wirklich seltsam und ich habe mehrere Fehler behoben, bis ich auf diese Antwort gestoßen bin.

root@ls:~# /usr/sbin/setenforce Permissive löste das Problem für mich.

Bade Adesemowo
quelle
0

Meine Situation ist etwas anders, aber Google hat mich hierher gebracht, und ich dachte, ich würde teilen ...

Mein Server läuft unter Debian Stable und der Versuch, ein Shell-Skript auszuführen, hat einmal funktioniert. Dann wurden die Berechtigungen automatisch auf 644 geändert und der nächste Versuch, das Skript auszuführen, kam Permission denied. Es stellte sich heraus, dass es sich für mich um ein Samba-Server-Problem handelte, und ich habe das Muster bis jetzt nicht bemerkt.

Die QA Strange-Berechtigung ändert sich, wenn die Datei auf einer Samba-Partition in einem Windows-Editor gespeichert wird . Ich wusste nichts über die map archive = noOption, selbst nachdem ich ein Jahrzehnt lang Samba-Freigaben verwendet hatte.

Etwas über die Verwendung von Notepad ++ auf einem Windows-Desktop würde die Berechtigungen der Zieldateien auf 675 anstelle von 775 ändern, während die umask eingerichtet ist.

Chris K
quelle
-7

Ausführen von root-Befehlen in PHP über Apache

Ich habe eine Webanwendung, die Shells-Befehle als root in einer PHP-Funktion ausführen muss, und Sie würden denken, dass dies ziemlich einfach wäre ... aber ich brauchte ein paar Brillen, um alle Details zu erhalten, also hier sind meine praktischen Hinweise dazu es. Dies ist auf einem Linux-System, auf dem Apache ausgeführt wird, und wir werden "sudo" in "shell_exec" verwenden, um die Befehle auszuführen.

Die Hauptsache ist, die Datei / etc / sudoers zu bearbeiten, und normalerweise können Sie (als root) den Befehl "visudo" verwenden, um dies zu tun.

Stellen Sie sicher, dass Apache Befehle ausführen kann und kein Passwort benötigt:

apache  ALL=(ALL)       NOPASSWD: ALL

Dann müssen Sie diese Zeile auskommentieren:

#Defaults    requiretty

Wenn Sie dies nicht tun, werden Sie diese Fehler in / var / log / secure sehen: "Entschuldigung, Sie müssen ein tty haben, um sudo auszuführen." Jetzt können Sie loslegen und der PHP-Code ist einfach:

$ results = shell_exec ('sudo date');

متعب المغيري
quelle
5
Das ist eine schreckliche Idee. Wenn Ihre Apache-Installation kompromittiert wird oder die Anwendung, die Sie ausführen, dies tut, erhält Ihr Hacker viel zu leicht vollen Zugriff auf das System. Das Richtige ist, die Berechtigungen für das Skript zu ändern und die Dinge nicht offen zu lassen
Journeyman Geek
2
Ich fühle mich aufgrund der offensichtlichen Sicherheitsprobleme, denen zufolge Apache-Benutzer / -Rolle alle Berechtigungen erhalten, verpflichtet, eine Ablehnung dieser Antwort vorzunehmen.
Ramhound
@JourneymanGeek Es ist nicht "wenn", sondern wenn die Installation kompromittiert wird.
Michael Hampton