Wie kann ich die Ausgabewerte von exec(), system() und passthru() überprüfen?

J

Jörgi15

Hallo zusammen,

ich habe ein Skript, das ein Datenbank-Backup ausführen soll.
Nachdem der Befehl ausgeführt wurde, möchte ich überprüfen, ob alles geklappt hat.

Wie geht das?

Ich habe bis jetzt mehrere Möglichkeiten durchgespielt:

$ausgabe = passthru('C:/xampplite/mysql/bin/mysqldump -u ' . $db_username . ' -p' . $db_password . ' -h ' . $db_host. ' ' . $db . ' > C:/dump.sql, $fp);
Ergebnis: $ausgabe ist immer leer, $fp ist immer 1 (auch wenn ich z.B. den Pfad so verändere, dass die Datei nicht gefunden wird).

oder

$ausgabe = exec('C:/xampplite/mysql/bin/mysqldump -u ' . $db_username . ' -p' . $db_password . ' -h ' . $db_host. ' ' . $db . ' > C:/dump.sql, $fp);
Ergebnis: $ausgabe ist immer leer, $fp nimmt untersch. Werte an: 256 bei Fehler, mal auch 255...
Bei Aufruf einer nicht vorhandenen Datei ist es 1 (und genau so bei erfolgreicher Ausführung).
 
Hi,

die frage wäre erstmal was die Rückgabewerte von mysqldump auf windows ist?
Bei unix shell apps ist klar, wenn nix zurückkommt ist alles super gelaufen.
Wie das bei Windows ist wage ich nicht vorherzusagen ohne die Mysql-,PHP,Windows - Version zu kennen.

Im allgemeinen würde ich dir von einer php - basierten ausführung erstmal pauschal abraten, im einzelfall kann es durchaus Sinn machen aber in der Masse ist so ein Backup über einen Webserver ein echtes Sicherheitsrisiko
.
zb könnte man dieses auf deine bedürfnissen anpassen:

http://teamtutorials.com/windows-tutorials/create-a-windows-daily-backup-script

un diese Dateien wenn es den sein muss per webserver zur verfügung stellen.

gruß

katoasan
 
Hi katoasan,

nene, der Server läuft unter Linux!
Ich hab oben nur Windows-Pfade gepostet, weil ich hier auf Windows entwickle (ich dachte das wäre für die Rückgabewerte egal...).

Aber ich brauch es für ein Linux-System.


Also, wenn ich das richtig verstehe, gibt exec(mysqldump ... , $fp); unter Linux etwas anderes zurück als unter Windows?
Na super...
Du sagst, wenn es geklappt hat, ist $fp nach der Ausführung unter Linux leer?
Oder allgemein: Gibt es dasgleiche zurück, wie wenn ich mysqldump einfach auf der Shell ausführe?

Zu der anderen Frage: Ich habe bereits ein Shell-Skript, das das erledigt, aber ich möchte den Code über ein PHP-basiertes GUI für den Anwender einfacher konfigurierbar machen.
Wo genau siehst du da ein Sicherheitsproblem? Die Backups liegen außerhalb des Webroot...

Viele Grüße

Jörg
 
Hi,

exec, passthtru system machen einen call auf einen Systemfunktion daher kann in ungünstigen Fällen Anwender - Code im Kontext des Webserver - Users ausgeführt werden. Das ist solange kein Problem, wie man nur nette Anweder hat :)

Du sagst, wenn es geklappt hat, ist $fp nach der Ausführung unter Linux leer?

na das kommt auf die Parameter an eine Vobose - Flag macht auch $fp voll :)

Oder allgemein: Gibt es dasgleiche zurück, wie wenn ich mysqldump einfach auf der Shell ausführe?

Ja

wenn es ein linuxsystem ist würde ich das Backup immer als cron laufen lassen. Vor allem kann das in eine rechtelosen Useraccount laufen.

Zu der anderen Frage: Ich habe bereits ein Shell-Skript, das das erledigt, aber ich möchte den Code über ein PHP-basiertes GUI für den Anwender einfacher konfigurierbar machen.

warum schreibst du die nicht in die DB dann kann das Backupscript die da auslesen Zugriff auf die DB hat es ja eh.

Gruß

katosan
 
Danke!

na das kommt auf die Parameter an eine Vobose - Flag macht auch $fp voll
Wenn ich "mysqldump -v" verwende, werden alle möglichen Infos ausgegeben, aber so detailliert brauch ich es eigentlich gar nicht. Mir reicht es, den Fall "Alles OK" von "Irgendein Fehler" unterscheiden zu können.

mysqldump gibt ohne den Parameter -v auf der Shell unter Linux folgendes aus:
- Wenn Host, DB-Benutzer oder Passwort falsch sind: "mysqldump: Got error 1045: Access denied for user..."
- Wenn falscher Datenbankname: "mysqldump: Got error: 1044: Access denied for user..."
- Wenn alles OK: nichts.

Also müsste es klappen, wenn ich exec('mysqldump...', $fp); nutze und dann prüfe, ob $fp leer ist:
PHP:
$fp = '';
exec('mysqldump -h ......', $fp);

if(empty($fp)) {
  return TRUE; # alles OK
} else {
  return FALSE; # Fehler!
}


warum schreibst du die nicht in die DB dann kann das Backupscript die da auslesen Zugriff auf die DB hat es ja eh. ... Das ist solange kein Problem, wie man nur nette Anweder hat
Was soll ich in die DB schreiben? Das Skript liest alle Angaben für den mysqldump-Aufruf aus einer Konfigurationsdatei ein. Da kann der Benutzer nichts verändern.
Der Benutzer soll nur noch den Zeitpunkt bzw. die Häufigkeit festlegen können.
Das sollte doch kein Problem sein, oder?
 
Also müsste es klappen, wenn ich exec('mysqldump...', $fp); nutze und dann prüfe, ob

jo eingentlich schon

Was soll ich in die DB schreiben? Das Skript liest alle Angaben für den mysqldump-Aufruf aus einer Konfigurationsdatei ein. Da kann der Benutzer nichts verändern.
Der Benutzer soll nur noch den Zeitpunkt bzw. die Häufigkeit festlegen können.
Das sollte doch kein Problem sein, oder?

na dann schreib das doch in die confdatei.
das wäre auf jeden eine aubere lösung.
 
Jo, da steht es auch so schon drin, dafür ist die Datei schließlich da. ;-)

Vielen Dank für Deine Hilfe!
 

Neue Beiträge

Zurück