Semi-OT: Perl-Script kann Verzeichnis nicht lesen
Hallo, bin dabei eine Script zu schreiben, das eine Liste mit Dateien erzeugen soll. Das Script anhand des Schlüsselwortes "thumb" ein vorhandenes Unterverzeichnis erkennt, soll dieses Verzeichnis geöffnet und die Liste der Dateien erstellen. Dummer Weise sagt es mir aber, dass das Verzeichnis nicht existiert. Das ist nat. vorhanden und lesbar! Hier der relevante Teil des Scriptes: ----------------------------------------------------------------------------------------------------------------------------- #!/usr/bin/perl my $result = opendir(DIR1,$base_dir) or die "read dir $base_dir - $!"; if($result) { @eintraege=map {Encode::decode 'utf8', $_} readdir DIR1; # Verzeichnisinhalt alphabetisch sortieren @eintraege = sort @eintraege; . . if ( grep(/medium/,@eintraege) gt 0 || grep(/thumb/,@eintraege) gt 0 ) { $pic_dir=2; } . } closedir DIR1; . . . # # neu einlesen der Bilder, wenn medium/thumb- Verzeichnisse vorhanden sind # if ( $pic_dir eq 2 ) { # alte Eintraege loeschen @eintraege=''; my $base_dir_neu=$base_dir."/thumb"; my $result_neu = opendir(DIR2,$base_dir_neu) or die "read dir $base_dir_neu - $!"; print "result_neu:".$result_neu."|<br>"; if($result_neu) { @eintraege=map {Encode::decode 'utf8', $_} readdir DIR2; . . . } clodedir DIR2; } ----------------------------------------------------------------------------------------------------------------------------- Wenn ich das Unterverzeichnis (also den Inhalt von $base_dir_neu), was angeblich nicht lesbar ist, nun als Ausgangsverzeichnis angebe, dann funktioniert alles und die Datei-/Verzeichnisliste wird erzeugt. Natürlich kann man das auch anders schreiben und nicht zwei "if"'s hintereinander. Das dient nur zum "debuggen", funktioniert so aber leider auch nicht. Was mache ich falsch? Es gibt einfach kein "$result_neu"..... :-( Das ganze wird i.Ü. in einem "cgi"-Script auf einer oS12.1 x86_64 Kiste verwendet. -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Lieber Reinhardt, was steht in $base_dir? Und Dein closedir am Ende sollte richtig geschrieben sein (aber das ist nicht das Problem!) Am Mittwoch, den 15.02.2012, 23:13 +0100 schrieb Sebastian Reinhardt:
Hallo, bin dabei eine Script zu schreiben, das eine Liste mit Dateien erzeugen soll. Das Script anhand des Schlüsselwortes "thumb" ein vorhandenes Unterverzeichnis erkennt, soll dieses Verzeichnis geöffnet und die Liste der Dateien erstellen. Dummer Weise sagt es mir aber, dass das Verzeichnis nicht existiert. Das ist nat. vorhanden und lesbar! Hier der relevante Teil des Scriptes: ----------------------------------------------------------------------------------------------------------------------------- #!/usr/bin/perl my $result = opendir(DIR1,$base_dir) or die "read dir $base_dir - $!"; if($result) { @eintraege=map {Encode::decode 'utf8', $_} readdir DIR1; # Verzeichnisinhalt alphabetisch sortieren @eintraege = sort @eintraege; . . if ( grep(/medium/,@eintraege) gt 0 || grep(/thumb/,@eintraege) gt 0 ) { $pic_dir=2; } . } closedir DIR1; . . . # # neu einlesen der Bilder, wenn medium/thumb- Verzeichnisse vorhanden sind # if ( $pic_dir eq 2 ) { # alte Eintraege loeschen @eintraege=''; my $base_dir_neu=$base_dir."/thumb"; my $result_neu = opendir(DIR2,$base_dir_neu) or die "read dir $base_dir_neu - $!"; print "result_neu:".$result_neu."|<br>"; if($result_neu) { @eintraege=map {Encode::decode 'utf8', $_} readdir DIR2; . . . } clodedir DIR2; } ----------------------------------------------------------------------------------------------------------------------------- Wenn ich das Unterverzeichnis (also den Inhalt von $base_dir_neu), was angeblich nicht lesbar ist, nun als Ausgangsverzeichnis angebe, dann funktioniert alles und die Datei-/Verzeichnisliste wird erzeugt. Natürlich kann man das auch anders schreiben und nicht zwei "if"'s hintereinander. Das dient nur zum "debuggen", funktioniert so aber leider auch nicht. Was mache ich falsch? Es gibt einfach kein "$result_neu"..... :-( Das ganze wird i.Ü. in einem "cgi"-Script auf einer oS12.1 x86_64 Kiste verwendet.
-- Mit freundlichen Grüßen
Sebastian Reinhardt
-- Beste Gruesse Christoph Stockmayer --------------------------------------------------- Ingenieurbuero Christoph Stockmayer GmbH Dipl.Ing. Chr. Stockmayer SCLT, CNI, LPIC1, CLA Dreihoehenstr. 1 90571 Schwaig Tel: 0911/505241 Fax: 0911/5009584 eMail: sto@stockmayer.de, christoph.stockmayer@gmx.de ePost: christoph.stockmayer@epost.de WWW: www.stockmayer.de, www.stockmayer.eu Geschaeftsfuehrer: Christoph Stockmayer HRB 1290, Bad Hersfeld, Abt. Rotenburg --------------------------------------------------- -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Wed, 15 Feb 2012, Sebastian Reinhardt schrieb:
Hier der relevante Teil des Scriptes:
Bevor du hier bei nem CGI nicht folgendes hast: ==== #!/usr/bin/perl -T use warnings; use strict; ==== braucht man sich den Rest erst gar nicht anschauen. -dnh -- Reporter (to Mahatma Gandhi): Mr Gandhi, what do you think of Western Civilization? Gandhi: I think it would be a good idea. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
On 16.02.2012 09:44, David Haller wrote:
Hallo,
Am Wed, 15 Feb 2012, Sebastian Reinhardt schrieb:
Hier der relevante Teil des Scriptes: Bevor du hier bei nem CGI nicht folgendes hast:
==== #!/usr/bin/perl -T use warnings; use strict; ====
braucht man sich den Rest erst gar nicht anschauen.
-dnh
Danke für die Ideen, nur leider bin ich schon weiter und es geht eben trotzdem nicht. Das zweite "closedir" hatte ich von Hand in die Mail rein geschrieben, da ich das beim Kopieren vergessen hatte...:-). Der Header sieht so aus: ----------------------------------------------------------------------- #!/usr/bin/perl -T # # # verwendete Module # use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); use CGI qw(-utf8); use URI::Escape; use Encode::Guess; use utf8; use warnings; use strict; ----------------------------------------------------------------------- Das Script wird i.Ü. so aufgerufen: ----------------------------------------------------------- http://localhost/cgi-bin/gallery.pl?lang=de&basedir=Media/Alttraktoren/Torbogengut_11 ----------------------------------------------------------- In dem Verzeichnis ist eben ein Unterverzeichnis "thumb" enthalten. Das möchte ich eben dem Nutzer nicht anzeigen, sondern gleich die Bilder. Wenn ich das Script mit dem Verzeichnis "Media/Alttraktoren/Torbogengut_11/thumb" aufrufe kommen die Bilder und das Verzeichnis ist lesbar. Das ist eben der Punkt, den ich nicht verstehe! Kann ich in einem cgi-Script nur einmal ein Verzeichnis öffnen? Wäre eher unlogisch ? Ich bekomme eben folgende Fehlermeldung: ------------------------------------------------------------------------------ Software error: read dir Media/Alttraktoren/Torbogengut_11/thumb - No such file or directory at /mnt/lvm/srv/www/vhosts/lmv-hartmannsdorf.de/cgi-bin/gallery.pl line 201. For help, please send mail to the webmaster (root@sommer mailto:root@sommer), giving this error message and the time and date of the error. ------------------------------------------------------------------------------ Alles sehr komisch... -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Reinhardt, der Pfad ist relativ zum CGI-Verzeichnis - mach ihn mal absolut! Am Donnerstag, den 16.02.2012, 16:03 +0100 schrieb Sebastian Reinhardt:
On 16.02.2012 09:44, David Haller wrote:
Hallo,
Am Wed, 15 Feb 2012, Sebastian Reinhardt schrieb:
Hier der relevante Teil des Scriptes: Bevor du hier bei nem CGI nicht folgendes hast:
==== #!/usr/bin/perl -T use warnings; use strict; ====
braucht man sich den Rest erst gar nicht anschauen.
-dnh
Danke für die Ideen, nur leider bin ich schon weiter und es geht eben trotzdem nicht. Das zweite "closedir" hatte ich von Hand in die Mail rein geschrieben, da ich das beim Kopieren vergessen hatte...:-). Der Header sieht so aus: ----------------------------------------------------------------------- #!/usr/bin/perl -T # # # verwendete Module # use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); use CGI qw(-utf8); use URI::Escape; use Encode::Guess; use utf8; use warnings; use strict; ----------------------------------------------------------------------- Das Script wird i.Ü. so aufgerufen: ----------------------------------------------------------- http://localhost/cgi-bin/gallery.pl?lang=de&basedir=Media/Alttraktoren/Torbogengut_11 ----------------------------------------------------------- In dem Verzeichnis ist eben ein Unterverzeichnis "thumb" enthalten. Das möchte ich eben dem Nutzer nicht anzeigen, sondern gleich die Bilder. Wenn ich das Script mit dem Verzeichnis "Media/Alttraktoren/Torbogengut_11/thumb" aufrufe kommen die Bilder und das Verzeichnis ist lesbar. Das ist eben der Punkt, den ich nicht verstehe! Kann ich in einem cgi-Script nur einmal ein Verzeichnis öffnen? Wäre eher unlogisch ? Ich bekomme eben folgende Fehlermeldung: ------------------------------------------------------------------------------ Software error:
read dir Media/Alttraktoren/Torbogengut_11/thumb - No such file or directory at /mnt/lvm/srv/www/vhosts/lmv-hartmannsdorf.de/cgi-bin/gallery.pl line 201.
For help, please send mail to the webmaster (root@sommer mailto:root@sommer), giving this error message and the time and date of the error.
------------------------------------------------------------------------------
Alles sehr komisch...
-- Mit freundlichen Grüßen
Sebastian Reinhardt
-- Beste Gruesse Christoph Stockmayer --------------------------------------------------- Ingenieurbuero Christoph Stockmayer GmbH Dipl.Ing. Chr. Stockmayer SCLT, CNI, LPIC1, CLA Dreihoehenstr. 1 90571 Schwaig Tel: 0911/505241 Fax: 0911/5009584 eMail: sto@stockmayer.de, christoph.stockmayer@gmx.de ePost: christoph.stockmayer@epost.de WWW: www.stockmayer.de, www.stockmayer.eu Geschaeftsfuehrer: Christoph Stockmayer HRB 1290, Bad Hersfeld, Abt. Rotenburg --------------------------------------------------- -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
On 16.02.2012 16:46, Christoph Stockmayer wrote:
Hallo Reinhardt, der Pfad ist relativ zum CGI-Verzeichnis - mach ihn mal absolut!
Danke, das war's! Ich habe meinen Denkfehler gefunden. Du hast völlig recht! Ich habe vor dem Aufruf des Verzeichnisses immer ein "chdir($http_base_dir)" ($http_base_dir="../httpdocs") gemacht. Die Verzeichnisstruktur auf dem Server ist so: [root-dir]/httpdocs <= da liegen die Daten (Seiten, Bilder und Media-Verzeichnis) [root-dir]/cgi-bin <= da liegen die Scripte Da bedeutet, dass ich beim ersten Durchgang nat. aus dem cgi- Verzeichnis korrekt raus komme, dann aber das erste mal in das übergeordnete Verzeichnis ([root-dir]/httpdocs/Media/Torbogengut_09) rein gehe und dann wieder ein "chdir($http_base_dir)" mache. Nur bin ich eben nicht mehr im "cgi"- Verzeichnis! Das heisst, das ich in der falschen Verzeichnisebene lande bzw. das Verzeichnis, in das ich zu wechseln versuche gar nicht existiert. Da hat der Rechner doch glatt Recht behalten mit der Fehlermeldung. Ok, dann vielen Dank für die Hilfe. Manchmal wird man eben "betriebsblind" -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
On 16.02.2012 18:01, Sebastian Reinhardt wrote:
On 16.02.2012 16:46, Christoph Stockmayer wrote:
Hallo Reinhardt, der Pfad ist relativ zum CGI-Verzeichnis - mach ihn mal absolut!
Danke, das war's! Ich habe meinen Denkfehler gefunden. Du hast völlig recht! Ich habe vor dem Aufruf des Verzeichnisses immer ein "chdir($http_base_dir)" ($http_base_dir="../httpdocs") gemacht. Die Verzeichnisstruktur auf dem Server ist so: [root-dir]/httpdocs <= da liegen die Daten (Seiten, Bilder und Media-Verzeichnis) [root-dir]/cgi-bin <= da liegen die Scripte Da bedeutet, dass ich beim ersten Durchgang nat. aus dem cgi- Verzeichnis korrekt raus komme, dann aber das erste mal in das übergeordnete Verzeichnis ([root-dir]/httpdocs/Media/Torbogengut_09) rein gehe und dann wieder ein "chdir($http_base_dir)" mache. Nur bin ich eben nicht mehr im "cgi"- Verzeichnis! Das heisst, das ich in der falschen Verzeichnisebene lande bzw. das Verzeichnis, in das ich zu wechseln versuche gar nicht existiert. Da hat der Rechner doch glatt Recht behalten mit der Fehlermeldung.
Ok, dann vielen Dank für die Hilfe. Manchmal wird man eben "betriebsblind"
Sorry, glatt was vergessen: Gelöst -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Thu, 16 Feb 2012, Sebastian Reinhardt schrieb:
On 16.02.2012 09:44, David Haller wrote: Danke für die Ideen, nur leider bin ich schon weiter und es geht eben trotzdem nicht. Das zweite "closedir" hatte ich von Hand in die Mail rein geschrieben, da ich das beim Kopieren vergessen hatte...:-). Der Header sieht so aus: #!/usr/bin/perl -T # # # verwendete Module # use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); use CGI qw(-utf8);
#!/usr/bin/perl -T use warnings; use strict; use CGI qw(:standard -utf8); use CGI::Carp qw(fatalsToBrowser); ...
use URI::Escape; use Encode::Guess; use utf8; Das Script wird i.Ü. so aufgerufen: http://localhost/cgi-bin/gallery.pl?lang=de&basedir=Media/Alttraktoren/Torbogengut_11
Na dann hoffe ich mal, daß du basedir auch schön un"taint"est.
In dem Verzeichnis ist eben ein Unterverzeichnis "thumb" enthalten.
In welchem???
Das möchte ich eben dem Nutzer nicht anzeigen, sondern gleich die Bilder. Wenn ich das Script mit dem Verzeichnis "Media/Alttraktoren/Torbogengut_11/thumb" aufrufe kommen die Bilder und das Verzeichnis ist lesbar. Das ist eben der Punkt, den ich nicht verstehe!
Welches ist im Script das aktuelle? Füge mal nach den anderen 'use' Direktiven folgendes ein: ==== use Cwd; die "PWD=" . cwd() . "\n"; ==== Hint: perldoc -f chdir
Alles sehr komisch...
Überhaupt nicht. -dnh -- Bored? Want hours of entertainment? Just set the initdefault to 6! Whee! -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (3)
-
Christoph Stockmayer
-
David Haller
-
Sebastian Reinhardt