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.
quelle
x
) für die Datei festgelegt? Haben Sie den Script-Interpreter in einer Shebang-Zeile angegeben?chmod 775 yourscript.sh
. Dadurch erhaltenr-x
"Andere" Benutzer Berechtigungen zum Lesen und Ausführen dieser Datei.Antworten:
Versuchen Sie die folgenden Vorschläge:
php -r "echo exec('whoami');"
r-x
Flaggenberechtigungen verfügen :chmod 755 dir; chmod 755 file
+s
der Datei ein Flag (sudo) hinzuzufügen (nicht empfohlen):chmod u+s file
,safe_mode
.include_path
, zB:php.ini
Datei:include_path ".:/usr/local/lib/php:/your/dir"
.htaccess
Datei:php_value include_path ".:/usr/local/lib/php:/your/dir"
/bin/sh
für Ihren Apache-Benutzer gültig ist (z. B. mit:)finger
.php.ini
:disable_functions
forexec
function nicht verwendenselinux-utils
installiert (ein Security-Enhanced Linux - System), prüfengetenforce
/setenforce
Konfiguration , wie sie in beschrieben @Tonin Antwort.Fehlerbehebung:
php.ini
oderhttpd.conf
Datei geändert haben, vergessen Sie nicht, den Webserver neu zu starten.php.ini
aller Art von Fehlern (display_error
,error_reporting
usw.).quelle
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:
Sie können die aktuelle Konfiguration auch vollständiger anzeigen:
Diese Änderung kann dauerhaft vorgenommen werden, indem Sie die
/etc/selinux/config
Datei bearbeiten und dieSELINUX
Variable aufpermissive
oder 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.log
Protokolldatei. 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 mitls -Z
:Diese Liste enthält den Benutzer, die Rolle und den Typ jeder Datei / jedes Verzeichnisses. Hier die
httpd_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.log
Zeilen auch an denaudit2allow
Befehl ü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
quelle
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.quelle
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 = no
Option, 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.
quelle
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:
Dann müssen Sie diese Zeile auskommentieren:
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