.sh über PHP ausführen (Rechteproblem)

Waldy

New Member
.sh über PHP ausführen (Rechteproblem) (gelöst)

Hi

wir haben in der Firma einen Shell Script im Cronjob laufen der Täglich ausgeführt wird und anschließend per Email die Daten an einen Kollegen verschickt wird.

Das funktioniert ganz wunderbar auch manuell per hand.

Jetzt wollte der Kollege selbst manuel den Script starten ohne großen aufwand, wenn er die aktuellen Daten haben will, wir haben dafür eine simple PHP seite gebaut wo drin das Shell Script aufgerufen wird.

PHP ruft das Script auf (zeigt das es bis zum ende ausführt), aber anschließend kann er die Email nicht verschicken weil ihm die Rechte fehlen die SQL Abfrage zu speichern und die (keine) Datein ran zu hängen.

in /var/log/apache2/error_log sieht man das hier

./sql_csv_mail.sh: line 32: belgium: Permission denied
./sql_csv_mail.sh: line 55: malaysia: Permission denied
./sql_csv_mail.sh: line 78: oesterreich: Permission denied

ich habe schon etwas mit den Rechten ausprobiert, aber erfolglos.

Habt ihr vielleicht paar Tips?

Gruß
Waldy
 
Last edited by a moderator:
Was steht denn in den Zeilen 32, 55 und 78 des Scripts?
Und was hast du mit den Rechten ausprobiert und es hat nicht funktionert?
 
dort steht die ausgabe von den SQL Abfragen

32 INTO OUTFILE 'belgium.csv';" > belgium
...
55 INTO OUTFILE 'malaysia.csv';" > malaysia
...
usw.

die eigentlich dann im Ordner
/var/lib/mysql/otrs7/belgium.csv (Rechte mysql mysql)
sein müssten

ich habe mit root root 777 Rechten für das script und die mailpage.php Datei ausprobiert und dann auch mit gleichem Recht wie der Apache2/PHP5 wwwrun root aber hat nicht geholfen.

Mit root root sollte man doch ohne Probleme auf alles zugreifen können oder nicht?

Oder hat das script nur die wwwrun root von Apache2 und PHP5 Rechte und kann somit nicht auf mysql zugreifen?
 
Das Problem ist vermutlich der Ort, an den du die .cvs-Dateien schreiben willst. Gib diese doch einfach mit absolutem Pfad an (z.B. unter /tmp) oder an einem anderen Ort deiner Wahl, an der der Webserver Schreibrechte hat.

Unterhalb von /var/lib/mysql haben Dateien, die nicht zum DBMS gehören eigentlich sowieso nichts verloren.
 
32 INTO OUTFILE 'belgium.csv';" > belgium
Die Zeile ist nicht vollständig! Außerdem versucht er nicht die belgium.csv zu schreiben sondern die Datei "belgium" die dann wohl SQL-Anweisungen enthält.

Zu den Rechten:
Bei der Ausführung von Scripten (sowohl PHP oder Shell) kommt es nicht darauf an welche Rechte das Script hat, sondern welche Rechte der User hat, welcher es ausführt. Beim Einsatz von mod_php ist der aufrufende User "wwwrun".

Sinnvoller wäre es das ganze Shell-Script zu posten. Dann können wir Dir genauer sagen was davon gut ist oder wo Probleme zu erwarten sind.
(Evtl. ist es sogar so simpel, dass es sich einfach in PHP umwandeln lässt und den ganzen Aufruf per Shell unnötig macht.)

huschi.
 
ja genau die Dateine werden zwischengespeichert und für Abfrage verwendet.

Ich habe den Tip verfolgt und habe die Dateien ins /tmp/ verlagert jetzt geht der Aufruf und generieren von Dateine und das Versenden geht auch wunderbar.
Er kann nur anschließend die *.csv (mysql mysql Rechte) Dateien nicht löschen, aber das ist nicht schlimm den die werden dann beim nächsten regulären Cronjob entfernt, wenn der Cronjob planmäßig durchläuft.

Code:
#!/bin/bash

# mysql login
MYUSER=****
MYPW=****

# Email für Versand
Reci=****

# SCQ Abfrage Belgium
echo "
SELECT
            ticket_0.tn AS 'OTRS',
            ticket_0.freetext5 AS 'MKS',
            ticket_0.freetext7 AS 'Customer',
            ticket_0.title AS 'Summery',
            ticket_state_0.name AS 'State',
            ticket_0.freetext9 AS 'System',
            ticket_0.freetext10 AS 'Component',
            ticket_0.create_time AS 'Created',
            ticket_0.id
FROM
            otrs.ticket ticket_0,
            otrs.ticket_state ticket_state_0
WHERE
            ticket_state_0.id = ticket_0.ticket_state_id AND 
            ((ticket_0.freetext13='Belgium') AND
            (ticket_0.freetext9 Like 'CINEO%')) AND
            EXISTS (SELECT ticket_history_0.ticket_id FROM otrs.ticket_history ticket_history_0 WHERE ticket_history_0.ticket_id = ticket_0.id AND ticket_history_0.queue_id = 184)
ORDER BY ticket_0.create_time
INTO OUTFILE '/tmp/otrs_belgium.csv';" > /tmp/belgium

# SCQ Abfrage Malaysia 
echo "
SELECT
            ticket_0.tn AS 'OTRS',
            ticket_0.freetext5 AS 'MKS',
            ticket_0.freetext7 AS 'Customer',
            ticket_0.title AS 'Summery',
            ticket_state_0.name AS 'State',
            ticket_0.freetext9 AS 'System',
            ticket_0.freetext10 AS 'Component',
            ticket_0.create_time AS 'Created',
            ticket_0.id
FROM
            otrs.ticket ticket_0,
            otrs.ticket_state ticket_state_0
WHERE
            ticket_state_0.id = ticket_0.ticket_state_id AND 
            ((ticket_0.freetext13='Malaysia') AND
            (ticket_0.freetext9 Like 'CINEO%')) AND
            EXISTS (SELECT ticket_history_0.ticket_id FROM otrs.ticket_history ticket_history_0 WHERE ticket_history_0.ticket_id = ticket_0.id AND ticket_history_0.queue_id = 184)
ORDER BY ticket_0.create_time
INTO OUTFILE '/tmp/otrs_malaysia.csv';" > /tmp/malaysia 

# SCQ Abfrage Österreich
echo "
SELECT
            ticket_0.tn AS 'OTRS',
            ticket_0.freetext5 AS 'MKS',
            ticket_0.freetext7 AS 'Customer',
            ticket_0.title AS 'Summery',
            ticket_state_0.name AS 'State',
            ticket_0.freetext9 AS 'System',
            ticket_0.freetext10 AS 'Component',
            ticket_0.create_time AS 'Created',
            ticket_0.id
FROM
            otrs.ticket ticket_0,
            otrs.ticket_state ticket_state_0
WHERE
            ticket_state_0.id = ticket_0.ticket_state_id AND 
            ((ticket_0.freetext13='Austria') AND
            (ticket_0.freetext9 Like 'CINEO%')) AND
            EXISTS (SELECT ticket_history_0.ticket_id FROM otrs.ticket_history ticket_history_0 WHERE ticket_history_0.ticket_id = ticket_0.id AND ticket_history_0.queue_id = 184)
ORDER BY ticket_0.create_time
INTO OUTFILE '/tmp/otrs_austria.csv';" > /tmp/oesterreich  
 
# SCQ Abfrage Schweiz
echo "
SELECT
            ticket_0.tn AS 'OTRS',
            ticket_0.freetext5 AS 'MKS',
            ticket_0.freetext7 AS 'Customer',
            ticket_0.title AS 'Summery',
            ticket_state_0.name AS 'State',
            ticket_0.freetext9 AS 'System',
            ticket_0.freetext10 AS 'Component',
            ticket_0.create_time AS 'Created',
            ticket_0.id
FROM
            otrs.ticket ticket_0,
            otrs.ticket_state ticket_state_0
WHERE
            ticket_state_0.id = ticket_0.ticket_state_id AND 
            ((ticket_0.freetext13='Switzerland') AND
            (ticket_0.freetext9 Like 'CINEO%')) AND
            EXISTS (SELECT ticket_history_0.ticket_id FROM otrs.ticket_history ticket_history_0 WHERE ticket_history_0.ticket_id = ticket_0.id AND ticket_history_0.queue_id = 184)
ORDER BY ticket_0.create_time
INTO OUTFILE '/tmp/otrs_switzerland.csv';" > /tmp/schweiz 

# SCQ Abfrage Singapur 
echo "
SELECT
            ticket_0.tn AS 'OTRS',
            ticket_0.freetext5 AS 'MKS',
            ticket_0.freetext7 AS 'Customer',
            ticket_0.title AS 'Summery',
            ticket_state_0.name AS 'State',
            ticket_0.freetext9 AS 'System',
            ticket_0.freetext10 AS 'Component',
            ticket_0.create_time AS 'Created',
            ticket_0.id
FROM
            otrs.ticket ticket_0,
            otrs.ticket_state ticket_state_0
WHERE
            ticket_state_0.id = ticket_0.ticket_state_id AND 
            ((ticket_0.freetext13='Singapore') AND
            (ticket_0.freetext9 Like 'CINEO%')) AND
            EXISTS (SELECT ticket_history_0.ticket_id FROM otrs.ticket_history ticket_history_0 WHERE ticket_history_0.ticket_id = ticket_0.id AND ticket_history_0.queue_id = 184)
ORDER BY ticket_0.create_time
INTO OUTFILE '/tmp/otrs_singapore.csv';" > /tmp/singapur  
 

#MySql starten mit query ausführen	
 
#mysql -h localhost -u $MYUSER -p$MYPW -D "otrs7" -e "Select..." execute SQL-Query
echo "mysql -h localhost -u $MYUSER -p$MYPW -D "otrs7" < belgium + malaysia" 
mysql -h localhost -u $MYUSER -p $MYPW -D "otrs7" < /tmp/belgium
mysql -h localhost -u $MYUSER -p $MYPW -D "otrs7" < /tmp/malaysia
mysql -h localhost -u $MYUSER -p $MYPW -D "otrs7" < /tmp/oesterreich
mysql -h localhost -u $MYUSER -p $MYPW -D "otrs7" < /tmp/schweiz
mysql -h localhost -u $MYUSER -p $MYPW -D "otrs7" < /tmp/singapur


#Email versenden mit Anhang mit mutt
echo "mutt -s "Tickets.csv" -a /tmp/otrs_belgium.csv + malaysia $Reci < /home/otrsmgr/Emailnachricht.txt"
mutt -s "Tickets.csv" -a /tmp/otrs_belgium.csv -a /tmp/otrs_malaysia.csv -a /tmp/otrs_austria.csv -a /tmp/otrs_switzerland.csv -a /tmp/otrs_singapore.csv $Reci < Emailnachricht.txt 

# Datein wird wieder gelöscht
echo "rm /tmp/otrs_belgium.csv + otrs_malaysia.csv"
rm /tmp/otrs_belgium.csv
rm /tmp/otrs_malaysia.csv
rm /tmp/otrs_austria.csv
rm /tmp/otrs_switzerland.csv
rm /tmp/otrs_singapore.csv

rm /tmp/belgium
rm /tmp/malaysia
rm /tmp/oesterreich
rm /tmp/schweiz
rm /tmp/singapur

echo "exit"
exit

achja hier wird das script in PHP aufgerufen
PHP:
<h2>Hier die wird das sql_scv_mail.sh ausgeführt:</h2><br>
<?php 
echo "Test.php /srv/www/htdocs <br>";
$cmd="./sql_csv_mail.sh";
$output=shell_exec($cmd);
echo $output;
?>

Danke für die Hilfe.
Gruß
Waldy
 
Last edited by a moderator:
Back
Top