mail() or die();

alaninalanin

Mitglied
Hallo,

ich habe jetzt shcon eine Weile rumprobiert und auch die Sendmaileinstellungen überprüft. Die PHP Einstellungen in der php.ini scheinen auch richtig zu sein.

Allerdings wird beim Ausführen keine Mail versendet.

wenn ich ein mail(.........) or die(); ausführe stirbt das Script auch, also tritt ein Fehler auf, allerdings weiss ich nicht welcher - kann ich die() noch einen Funktionsaufruf mitgeben, so dass ich sehe, welcher Fehler auftritt?

Vielen Dank
Jörg
 
Vielen Dank für deine Antwort.

Das habe ich schon überprüft. Wenn ich eine Mail über die Konsole schreibe funktioniert alles wunderbar.

Die Mails werden lokal and Sendmail gegeben, der lokale Dienst verbindet zu unserem SMTP Server und dieser akzeptiert die EMail und versendet diese dann.

Allerdings werden keine Mails von PHP an Sendmail übergeben. Ich bekomme keine Fehlermeldungen und gar nichts. Schreibe ich allerdings ein "or die()" hinter den mail() Aufruf, stirbt das Script, also muss etwas mit mail() ansich falsch sein. Leider bekomme ich ohne Fehlermeldung nicht heraus was.

in der php.ini steht auch sendmail_path = /usr/bin/sendmail -t -i

Jörg
 
Zuletzt bearbeitet:
Ich habe jetzt die Logs ein wenig analysiert und jedesmal, wenn ich einen Aufruf von mail() im PHP Script habe, wird eine Meldung in /var/log/messages geschrieben:

kernel: audit(1182849870.627:4607): avc: denied { execute } for pid=17651 comm="httpd" name="bash" dev=dm-0 ino=27590690 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:shell_exec_t:s0 tclass=file

weiß damit einer etwas anzufangen?
 
Vielleicht liegts an falschem PHP-Code ?
Sind im PHP die Error-Funkionen eingeschaltet ?

Vielleicht ist es Sinnvoll, eine ganz primitive Mail zu senden, um zu sehen, ob überhaupt was geht. Was ist in /var/mail zu sehen ? Kommt was zurück ? Hast Du einen Blick in /var/spool/mail geworfen ?
 
Ja, das kommt von SELinux und bedeutet, dass der http-daemon kein Recht hat, einen Shell-Befehl auszuführen. NUR um zu testen, ob Du OHNE SELinux über PHP eine Mail senden kannst, schalte SELinux mal aus:

Shell-Befehl:
Code:
echo "0" > /selinux/enforcing

Nach dem testen bitte mit "echo "1" wieder anschalten, damit Dein System nicht gefährdet ist !
 
Du bist spitze,

ich habe das jetzt ausprobiert und tatsächlich werden die Mails jetzt versendet und kommen auch ohne Probleme an.

Gibt es eine Möglichkeit, dass ich SELinux sage, dass der httpd genau diesen einen Befehl ausführen darf?

Hast du ein gutes HOW-TO? Wo ich nähere Infos finden kann?

Vielen Dank
Jörg
 
Wie man an meiner Signatur sieht, beschäftige ich mit SELinux :D

Natürlich kann ich Dir sagen, wie Du das hinbekommst ;)

Zuerst führst Du an der Konsole folgendes aus:
Code:
audit2allow -d

Das gibt Dir erstmal Informationen aus den Kernel-Messages (Dort wird SELinux gesteuert) welche Anwendungen/Dienste Fehler-meldungen ausgeben.

Du suchst Dir jetzt die Zeile, in der "httpd" auftaucht und tippst diese Zeile an der Konsole neu ein, und machst nach dieser Zeile eine Umleitung der Ausgabe nach folgender Datei:

Die datei apache.te sollte irgendwo in /etc/selinux/policy sein - sie gibts auch nur EIN mal,
leider weiss ich das bei deinem System nicht, so dass Du dir das selbst anpassen musst.

Shell-Befehl:
Code:
echo "allow httpd_t shell_exec_t:file execute" >> /etc/selinux/policy/src/Pfad/zu/apache.te

Danach gehst Du in das Verzeichnis /etc/selinux/policy/src und gibst an der Konsole
folgenden Befehl ein:
Code:
make reload

Sollte die selbe Fehlermeldung weiterhin auftauchen, musst Du die Policy von SELinux neu kompilieren, das machst Du ganz einfach mit diesem Befehl (ebenfalls im Verz. src der Policy):
Code:
make clean
make
make install
make load

Das ganze dauert nur eine bis 2 Minuten ;)

LG
Andy
 
Zuletzt bearbeitet:
Hallo,

ich bin leider nicht ganz so sicher was ich wirklich tue und will auch nichts kaputt machen...

ich habe jetzt dieses audit2allow -d eingegeben und bekomme folgendes:

Code:
[root@*** src]# audit2allow -d
allow httpd_t http_port_t:tcp_socket name_connect;
allow httpd_t shell_exec_t:file { execute execute_no_trans getattr read };
allow system_mail_t httpd_t:file read;
allow webalizer_t bin_t:dir search;
allow webalizer_t httpd_config_t:dir search;

in meinem /etc/selinux/ direkt gibt es kein policy - dafür aber unter "/etc/selinux/targeted"

in dem Ordner gibt es aber kein src und auch keine apache.te

Ich habe also dort einen Ordner src angelegt und dort die apache.te angelegt und dort
Code:
allow httpd_t shell_exec_t:file { execute execute_no_trans getattr read };
eingetragen.

beim make reload bekomme ich aber dann die Meldung, dass es keine Regel um reload zu erstellen gäbe.

Oder soll ich in /etc/selinux/ einen Ordner policy erstellen?

Ich habe ein Fedora Core 4 installiert.

Vielen Dank
Jörg
 
Hm,

das macht es etwas schwieriger ...

Du kannst erstmal probieren,ob folgender Shell-(Konsolen-)Befehl schon Wirkung zeigt:
Code:
setsebool httpd_ssi_exec=1

Bevor ich Dir erklären müsste, wie du die Policy updatest.
 
Zurück