Shell-Befehlauf Existenz prüfen

Shell-Befehlauf Existenz prüfen

am 02.07.2006 16:42:34 von Niels Braczek

Moin moin,

gibt es eine Möglichkeit festzustellen, ob ein bestimmtes Shell-Kommand=
o
via exec() erreichbar/verfügbar ist?

Konkret möchte ich mysqldump per exec aufrufen, wenn erstens exec()
erlaubt ist und zweitens der Befehl mysqldump existiert, ansonsten wird
der Dump per PHP erstellt.

Dazu muss ich (auf Win genauso wie auf *nix) feststellen können, ob es
überhaupt einen Befehl 'mysqldump' auf dem System gibt.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 17:29:47 von daniel.gorski

[Niels Braczek in de.comp.lang.php.misc]

>gibt es eine Möglichkeit festzustellen, ob ein bestimmtes Shell-Kommando
>via exec() erreichbar/verfügbar ist?

Via exec()/system() `whereis mysqldump` ausführen und das Ergebnis
überprüfen?

mfg dtg

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 17:33:10 von daniel.gorski

[Daniel T. Gorski in de.comp.lang.php.misc]

>[Niels Braczek in de.comp.lang.php.misc]
>
>>gibt es eine Möglichkeit festzustellen, ob ein bestimmtes Shell-Kommando
>>via exec() erreichbar/verfügbar ist?
>
>Via exec()/system() `whereis mysqldump` ausführen und das Ergebnis
>überprüfen?

Nachtrag: die zusätzliche Windows-Anforderung hab ich dich wohl glatt
überlesen. Dazu fällt mir nichts anderes ein als unter Windows den
kram direkt von PHP machen zu lassen :)

mfg dtg

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 17:52:03 von Johannes Vogel

Hi Niels

Niels Braczek wrote:
> gibt es eine Möglichkeit festzustellen, ob ein bestimmtes Shell-Kommando
> via exec() erreichbar/verfügbar ist?
> Konkret möchte ich mysqldump per exec aufrufen, wenn erstens exec()
> erlaubt ist und zweitens der Befehl mysqldump existiert, ansonsten wird
> der Dump per PHP erstellt.
> Dazu muss ich (auf Win genauso wie auf *nix) feststellen können, ob es
> überhaupt einen Befehl 'mysqldump' auf dem System gibt.

Ich würd's wohl einfach probieren (Bspw. mit dummy-Angaben) und dann den
Fehler auswerten.

Wenn du den Dump sowieso per PHP entwickeln möchtest, warum lässt du die
Wahl von mysqldump nicht sowieso bleiben? Wenn du dir schon den Aufwand
machst...

HTH; Johannes

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 19:49:38 von Stephan Mann

On 2006-07-02 16:42:34, Niels Braczek wrote:
> gibt es eine Möglichkeit festzustellen, ob ein bestimmtes Shell-Kommando
> via exec() erreichbar/verfügbar ist?
>
> Konkret möchte ich mysqldump per exec aufrufen, wenn erstens exec()
> erlaubt ist und zweitens der Befehl mysqldump existiert, ansonsten wird
> der Dump per PHP erstellt.
>
> Dazu muss ich (auf Win genauso wie auf *nix) feststellen können, ob es
> überhaupt einen Befehl 'mysqldump' auf dem System gibt.

Ich moechte bezweifeln, dass das mit vertretbarem Aufwand zuverlaessig zu
loesen ist. Warum kann das keine Konfigurations-Option sein? Zumal dir der
blosse Existenzbeweis ja auch nicht in 100% aller Faelle weiterhilft.

Wenn es sein muss koenntest du vielleicht schauen, was fuer
Registry-Eintraege MySQL auf einem Windows so anlegt. Fuer *nix "apropos"
oder "locate". Bei letzterem haettest du auch gleich den Pfad mit dabei.
Aber "locate" ist ja leider auch nicht ueberall verfuegbar.

stephan

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 21:02:23 von unknown

Post removed (X-No-Archive: yes)

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 21:34:49 von Niels Braczek

Daniel T. Gorski schrieb:

> Nachtrag: die zusätzliche Windows-Anforderung hab ich dich wohl glatt=

> überlesen. Dazu fällt mir nichts anderes ein als unter Windows den
> kram direkt von PHP machen zu lassen :)

Das ist Plan B. Zurzeit prüfe ich auf Windows und gehe ggf. direkt zur
Emulation, auch wenn exec() aktiviert ist.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 21:38:52 von Niels Braczek

Johannes Vogel schrieb:
> Niels Braczek wrote:

>> gibt es eine Möglichkeit festzustellen, ob ein bestimmtes Shell-Komm=
ando
>> via exec() erreichbar/verfügbar ist?

> Ich würd's wohl einfach probieren (Bspw. mit dummy-Angaben) und dann =
den
> Fehler auswerten.

Dummerweise ist der Exit-Code (unter Windows) 0, was eigentlich 'in
Ordnung' bedeutet. Das zurückgelieferte Ergebnis-Array ist leer (also
keine Meldung).

> Wenn du den Dump sowieso per PHP entwickeln möchtest, warum lässt d=
u die
> Wahl von mysqldump nicht sowieso bleiben? Wenn du dir schon den Aufwand=

> machst...

mysqldump ist in C/C++ geschrieben und schnell. PHP ist interpretiert
und langsam. Gerade bei Datensicherungen (insbesondere beim Restore)
trifft man gerne auf das Time-Limit, so dass ich die schnellstmögliche
Variante benutzen will.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 21:42:02 von Niels Braczek

Dirk Sohler schrieb:
> Niels Braczek schrieb 2006-07-02, 16:42 Uhr

>> gibt es eine Möglichkeit festzustellen, ob ein bestimmtes Shell-Komm=
ando
>> via exec() erreichbar/verfügbar ist?
>=20
> Ausprobieren. Wenns geht: Vorhanden; wenn nicht: Nicht vorhanden :)

Das ist leichter gesagt als getan. Unter Windows habe ich bisher nichts
feststellen können, was mir das Misslingen andeutet.

> Start -> Ausführen -> cmd -> mysqldump
>=20
> "Der Befehl "mysqldump" ist entweder falsch geschrieben oder konnte nic=
ht
> gefunden werden."
>=20
> Also hier nicht... Oder was wolltest du jetzt wissen?

Genau. Und das jetzt nochmal in PHP...

Mf
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 22:34:30 von Carsten Wiedmann

Niels Braczek schrieb:

> Johannes Vogel schrieb:
> > Niels Braczek wrote:
>
> > > gibt es eine Möglichkeit festzustellen, ob ein bestimmtes
> > > Shell-Kommando
> > > via exec() erreichbar/verfügbar ist?
>
> > Ich würd's wohl einfach probieren (Bspw. mit dummy-Angaben) und dann den
> > Fehler auswerten.
>
> Dummerweise ist der Exit-Code (unter Windows) 0, was eigentlich 'in
> Ordnung' bedeutet. Das zurückgelieferte Ergebnis-Array ist leer (also
> keine Meldung).

bei:
| exec('mysqldump', $output, $return_var);
hast du in $return_var doch den Exitcode (man muss halt auf jeden Fall auch
$output verwenden).

- gibt es das Programm nicht, hast du dort den Wert (int)1
- kann das Programm ohne Fehler ausgeführt werden (int)0
- tritt in diesem Programm ein Fehler auf, dann hast du dort den Fehlercode
den das Programm liefert. Also auch != (int)0

Das funktioniert in Windows genauso wie unter *nix.

Gruß
Carsten

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 23:13:33 von Niels Braczek

Carsten Wiedmann schrieb:
> Niels Braczek schrieb:

>> Dummerweise ist der Exit-Code (unter Windows) 0, was eigentlich 'in
>> Ordnung' bedeutet. Das zurückgelieferte Ergebnis-Array ist leer (als=
o
>> keine Meldung).
>=20
> bei:
> | exec('mysqldump', $output, $return_var);
> hast du in $return_var doch den Exitcode (man muss halt auf jeden Fall =
auch=20
> $output verwenden).
>=20
> - gibt es das Programm nicht, hast du dort den Wert (int)1
> - kann das Programm ohne Fehler ausgeführt werden (int)0
> - tritt in diesem Programm ein Fehler auf, dann hast du dort den Fehler=
code=20
> den das Programm liefert. Also auch !=3D (int)0
>=20
> Das funktioniert in Windows genauso wie unter *nix.

Das dachte ich bisher auch. $output ist jedoch leer und $return_var===
0
bei Aufruf unter Windows ohne mysqldump.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 23:28:39 von Carsten Wiedmann

Niels Braczek schrieb:

> Carsten Wiedmann schrieb:
> > bei:
> > > exec('mysqldump', $output, $return_var);
> > hast du in $return_var doch den Exitcode (man muss halt auf jeden
> > Fall auch $output verwenden).
> >
> > - gibt es das Programm nicht, hast du dort den Wert (int)1
> > - kann das Programm ohne Fehler ausgeführt werden (int)0
> > - tritt in diesem Programm ein Fehler auf, dann hast du dort den
> > Fehlercode den das Programm liefert. Also auch != (int)0
> >
> > Das funktioniert in Windows genauso wie unter *nix.
>
> Das dachte ich bisher auch. $output ist jedoch leer und $return_var==0
> bei Aufruf unter Windows ohne mysqldump.

Was meinst du mit "ohne mysqldump":
a) Ein Windows wo das Programm mysqldump nicht installiert ist?
b) oder ein exec() mit einem leeren Commandstring?

Also (a) funktioniert bei mir ohne Probleme (XP).
Bei (b) kommt eine Warning, exec() liefet false zurück, $output ist leer und
$return_var==0

Gruß
Carsten

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 23:36:02 von Niels Braczek

Carsten Wiedmann schrieb:
> Niels Braczek schrieb:
>> Carsten Wiedmann schrieb:

>> > Das funktioniert in Windows genauso wie unter *nix.
>>
>> Das dachte ich bisher auch. $output ist jedoch leer und $return_var=3D=
=3D0
>> bei Aufruf unter Windows ohne mysqldump.
>=20
> Was meinst du mit "ohne mysqldump":
> a) Ein Windows wo das Programm mysqldump nicht installiert ist?
> b) oder ein exec() mit einem leeren Commandstring?

Ich meine a). Der Command-String lautet sinngemäß

mysqldump --host=3Dxxx --user=3Dxxx --password=3Dxxx --add-drop-table
--comment=3D1 dbname

> Also (a) funktioniert bei mir ohne Probleme (XP).

Hier nicht (Win ME). Lautet PHP_OS bei dir auch 'WIN32'?
Vielleicht muss ich ja nur alte Windows-Versionen gesondert behandeln.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Shell-Befehlauf Existenz prüfen

am 02.07.2006 23:48:07 von Kai Ruhnau

Niels Braczek wrote:
> Carsten Wiedmann schrieb:
>> Niels Braczek schrieb:
>>> Carsten Wiedmann schrieb:
>
>>>> Das funktioniert in Windows genauso wie unter *nix.
>>> Das dachte ich bisher auch. $output ist jedoch leer und $return_var==0
>>> bei Aufruf unter Windows ohne mysqldump.
>> Was meinst du mit "ohne mysqldump":
>> a) Ein Windows wo das Programm mysqldump nicht installiert ist?
>> b) oder ein exec() mit einem leeren Commandstring?
>
> Ich meine a). Der Command-String lautet sinngemäß
>
> mysqldump --host=xxx --user=xxx --password=xxx --add-drop-table
> --comment=1 dbname

Anstelle von --add-drop-table sollte man --opt benutzen. Das setzt noch
mehrere andere nützliche Flags, die man üblicherweise auch möchte.
Andererseits ist --opt ab dem mysqldump von MySQL 4.1 automatisch
gesetzt, sodass man --add-drop-table dann sowieso weglassen kann.

>> Also (a) funktioniert bei mir ohne Probleme (XP).
>
> Hier nicht (Win ME). Lautet PHP_OS bei dir auch 'WIN32'?
> Vielleicht muss ich ja nur alte Windows-Versionen gesondert behandeln.

Ist das mysqldump-Binary denn im Pfad vorhanden, oder nur unerreichbar
unterhalb des MySQL-Verzeichnisses abgelegt? Schließlich muss man auch
unter *NIX $PATH anpassen, wenn man MySQL beispielsweise unterhalb von
/opt/mysql ablegt. Ich hab' allerdings vergessen wo und wie das unter
Windows funktioniert.

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Shell-Befehlauf Existenz prüfen

am 03.07.2006 00:00:55 von Niels Braczek

Kai Ruhnau schrieb:
> Niels Braczek wrote:

>> mysqldump --host=3Dxxx --user=3Dxxx --password=3Dxxx --add-drop-table
>> --comment=3D1 dbname
>=20
> Anstelle von --add-drop-table sollte man --opt benutzen. Das setzt noch=
=20
> mehrere andere nützliche Flags, die man üblicherweise auch möchte=
.
> Andererseits ist --opt ab dem mysqldump von MySQL 4.1 automatisch=20
> gesetzt, sodass man --add-drop-table dann sowieso weglassen kann.

Das ist nicht das Problem; mysqldump dient hier nur als Beispiel für ei=
n
beliebiges über die Shell aufrufbares Kommando. Die Optionen entspreche=
n
dem aktuellen Entwicklungsstand der Emulation -- Kombi-Optionen werden
noch nicht ausgewertet.

> Ist das mysqldump-Binary denn im Pfad vorhanden, oder nur unerreichbar =

> unterhalb des MySQL-Verzeichnisses abgelegt? Schließlich muss man auc=
h=20
> unter *NIX $PATH anpassen, wenn man MySQL beispielsweise unterhalb von =

> /opt/mysql ablegt. Ich hab' allerdings vergessen wo und wie das unter=20
> Windows funktioniert.

Der Punkt ist, dass mysqldump überhaupt nicht vorhanden ist. Ich suche
nach einem Weg, dies (oder ggf. das Gegenteil) zuverlässig im Skript
festzustellen. Das Pfadproblem ist dabei erstmal sekundär, das lässt
sich mittels whereis lösen -- wenn ich denn weiß, dass whereis zur
Verfügung steht ;-).

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Shell-Befehlauf Existenz prüfen

am 03.07.2006 00:24:51 von Kai Ruhnau

Niels Braczek wrote:
> Kai Ruhnau schrieb:
>> Niels Braczek wrote:
>
>> Ist das mysqldump-Binary denn im Pfad vorhanden, oder nur unerreichbar
>> unterhalb des MySQL-Verzeichnisses abgelegt? Schließlich muss man auch
>> unter *NIX $PATH anpassen, wenn man MySQL beispielsweise unterhalb von
>> /opt/mysql ablegt. Ich hab' allerdings vergessen wo und wie das unter
>> Windows funktioniert.
>
> Der Punkt ist, dass mysqldump überhaupt nicht vorhanden ist. Ich suche
> nach einem Weg, dies (oder ggf. das Gegenteil) zuverlässig im Skript
> festzustellen. Das Pfadproblem ist dabei erstmal sekundär, das lässt
> sich mittels whereis lösen -- wenn ich denn weiß, dass whereis zur
> Verfügung steht ;-).

Wie Stephan Mann schon schrieb würde ich die Existenz nicht überprüfen
wollen. Während du die gesamten Festplatten / Partitionen / gemountete
Netzwerkshares durchsuchst, wärst du mit der PHP-Lösung schon fertig.
Auch ein whereis unter UNIX beschränkt sich auf einige wenige Bereiche
im Verzeichnisbaum (ein /opt/mysql/bin vernachlässigt es laut manpage).

Erreichbarkeit dagegen sollte doch mit einem einfachen

exec('mysqldump --version',$output,$return_var);

und der Überprüfung von $output funktionieren, oder vergesse ich etwas?

~ $ php
exec('mysqldump --version',$output,$eror);
var_dump($output);
?>^D
array(1) {
[0]=>
string(60) "mysqldump Ver 10.10 Distrib 5.0.16, for pc-linux-gnu (i686)"
}

Wenn nichts passendes in output drin steht, dann hakt es irgendwo.

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Shell-Befehlauf Existenz prüfen

am 03.07.2006 00:35:55 von Carsten Wiedmann

Niels Braczek schrieb:

> Ich meine a). Der Command-String lautet sinngemäß
>
> mysqldump --host=xxx --user=xxx --password=xxx --add-drop-table
> --comment=1 dbname
>
> > Also (a) funktioniert bei mir ohne Probleme (XP).
>
> Hier nicht (Win ME). Lautet PHP_OS bei dir auch 'WIN32'?
> Vielleicht muss ich ja nur alte Windows-Versionen gesondert behandeln.

Tatsache :-/ Unter Win9x (PHP_OS == 'WIN32') ist der return code immer 0.

Ab NT4 ist PHP_OS == 'WINNT'.

Gruß
Carsten

Re: Shell-Befehlauf Existenz prüfen

am 03.07.2006 00:56:13 von Niels Braczek

Kai Ruhnau schrieb:

> Erreichbarkeit dagegen sollte doch mit einem einfachen
>=20
> exec('mysqldump --version',$output,$return_var);
>=20
> und der Überprüfung von $output funktionieren, oder vergesse ich et=
was?

Richtig; das scheint tatsächlich brauchbar zu sein. Diese Lösung war
wohl zu naheliegend ...

Danke!

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Shell-Befehlauf Existenz prüfen

am 03.07.2006 00:57:03 von Niels Braczek

Carsten Wiedmann schrieb:
> Niels Braczek schrieb:

>> Hier nicht (Win ME). Lautet PHP_OS bei dir auch 'WIN32'?
>> Vielleicht muss ich ja nur alte Windows-Versionen gesondert behandeln.=

>=20
> Tatsache :-/ Unter Win9x (PHP_OS == 'WIN32') ist der return code im=
mer 0.
>=20
> Ab NT4 ist PHP_OS == 'WINNT'.

Gut, dann schließe ich einfach WIN32 von vornherein aus.

Danke!

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------