perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 23
Click for quality!




11.02.2012 / 16:26

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitragopendir() auf Netzwerkfreigaben
Seitenanfang
Hallo liebe Perl-Gemeinde, mein Problem dürfte bereits bekannt sein, doch ich habe leider bisher keine Lösung in den Tiefen des Netzes finden können.
Wenn ich mit opendir() ein lokales Verzeichnis z.B. C:\ auflisten lasse, funktioniert das problemlos. N:\ ist z.B. aber ein Netzlaufwerk und da gibt die Funktion nur einen Fehler zurück. Zum allgemeinen Verständnis: ich arbeite unter Windows 2000. Mein Server ist öffentlich und auf diesem laufen nur die fertigen Scripte. Mit einem anderen physischen Rechner erstelle ich meine Programme. Die Umgebungen sind insoweit identisch, bis auf das auf dem Server auch die Server Version von Microsoft läuft und auf dem Arbeitsrechner die Pro Version. Auf dem Server befinden sich alle benötigten Daten und Datenbanken. Eigentlich greife ich mit dem Arbeitsrechner immer auf den selben Datenbestand des Servers (nur lesend) zu und wollte den Datenbestand nicht nochmal auf den Arbeitsrechner spiegeln. As handelt sich um ca. 60 GB. Um aber identische Ergebnisse zu erzielen, ist es wichtig, daß auch tatsächlich auf den selben Datenbestand zugegriffen wird, genau wie das die öffentlichen Scripte tun. Ich habe mir auch schon über NAS/SAN Gedanken gemacht, werde da aber mit meinen Scripten Probleme bekommen, zumindest unter Windows. Ein anderes System kommt aber nicht in Frage. Vielleicht konnte schonmal jemand das Problem lösen. Über Ratschläge wäre ich dankbar.

Datum: 15.06.2007-11:52

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Kann ich nicht nachvollziehen, welche Fehlermeldung tritt denn auf?

Ich habe bei mir 3 Netzlaufwerke, bei denen auch beim Systemstart versucht wird die Verbindung wiederherzustellen, was nicht gelingt da die Anmeldedaten von meinen Benutzerkonto sich von den Anmeldedaten des Netzlaufwerks unterscheiden.

Das heiszt nach dem Systemstart muss ich zuerst ein Laufwerk aufrufen, Windows fordert mich dann auf ein anderes PW ggf. auch anderen Benutzernamen einzugeben, erst dann laesst sich das Netzlaufwerk verwenden.

Dass mache ich zum Beispiel fuer Laufwerk B, unter den Arbeitsplatz wird nun Laufwerk B auch als 'Netzlaufwerk' angezeigt, die anderen zwei noch immer als 'Nichtverbundenes Netzlaufwerk'.
In diesen Zustand fuehre ich fuer das verbundene LW folgenden Einzeiler aus


C:\Dokumente und Einstellungen\dash>perl -le "opendir(DH, 'B:/') or die $!; prin
t for readdir(DH);"

das listet mir die Eintraege aus dem Verzeichnis korrekt auf.
Den selben Einzeiler fuehre ich noch einmal aus nur 'B:/' ersetzt durch 'Z:/' fuer das nicht verbundene Netzlaufwerk, das Ergebnis ist die Fehlermeldung:

No such file or directory at -e line 1.

Perl duerfte es eigentlich ziemlich egal sein ob das Verzeichnis dass geoeffnet werden soll auf einen physikalischen Laufwerk oder einen Netzlaufwerk liegt. Perl greift nicht direkt auf das Dateisystem zu sondern nutzt Funktionen die vom Betriebssystem bereitgestellt werden (vermutlich eine Funktion aehnlich wie OpenDirectory, kenne die WinAPI nicht), erst das Betriebssystem muss sich darum kuemmern wie die Anfrage fuer ein Verzeichnis zubehandeln ist - ob der Zugriff auf ein Netzlw oder ein generisches LW erfolgen muss und welche weiteren Systemaufrufe abgesetzt werden muessen.

Datum: 15.06.2007-16:03

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Danke erstmal für Deine Mithilfe!

Hier die Fehlermeldung:

J:/: No such file or directory at d:\inetpub\cgi-bin\opendir.pl line 16.

Und hier das Stück Programm dazu:


#!/usr/bin/perl -w
use strict;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
print "Content-type: text/html\n\n";
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
print "<html>\n";
print "<head>\n";
print "<title>opendir()</title>\n";
print "</head>\n";
print "<body text=\"#000000\" bgcolor=\"#FFFFFF\"><p>\n";
my $Verzeichnis = "J:/";
opendir(DIR, $Verzeichnis) || die "$Verzeichnis: $!";
my @Eintraege = readdir(DIR);
closedir(DIR);
foreach(@Eintraege) {
print "$_<br>\n";
}
print "</p></body></html>\n";

Und weißt Du, was das Phänomen ist? In der Kommandozeile, so wie Du es angegeben hast, funktioniert es! Wenn ich da J:/ einsetze listet er mir korrekt alle Verzeichniseinträge auf. Wenn ich das Script über den Browser starte, gibts die Fehlermeldung. Wenn ich statt J:/ aber C:/ einsetze klappt alles wie gewünscht, nur will ich eben nicht an die Daten auf C, sondern auf J. Es würde mich nicht überraschen, wenn auch bei Dir die Ausgabe über den Browser scheitert, wenn Du ein Netzlaufwerk einsetzt. Momentan bin ich an dieser Stelle mit meinem Latein am Ende.

Datum: 15.06.2007-23:02

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Ich hab hier auf'm Windows 'n XAMPP laufen, Script kopiert, Laufwerksbuchstaben entsprechend geaendert und aufgerufen => funzt.

Ich vermute dass der Benutzer unter dem der Webserver laeuft keine Berechtigung hat das Netzlaufwerk zu oeffnen.

Der Webserver laeuft auch auf der gleichen Maschine? (Sorry wenn ich so dumm frage, aber manchmal... ;0) )

Datum: 16.06.2007-01:31

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Also XAMPP sagt mir gar nichts. Auf dem Server und dem Arbeitsrechner läuft jeweils Active Perl 5.8 mit IIS. Normal im Windows kann ich alle Freigaben problemlos benutzen. Ich würds ja verstehen, wenn ich mich via Perl noch authentifizieren müsste, wenn ich auf ein fremdes Laufwerk zugreifen möchte, aber zumindest opendir() bietet hier keine weiteren Parameter. Wenn ich mich an den Rechnern irgendwie anmelde, dann auch nur mit dem Administrator-Account. Mein Arbeitsrechner ist ebenfalls Mitglied des Active Directory, welches der Server als primärer DC zur Verfügung stellt. Hört sich zwar alles ganz toll an, ist aber eigentlich eine eher überschaubare Entwicklungsumgebung. Mich würde mal interessieren, wie das bei Dir aufgebaut ist, da es bei Dir ja offensichtlich funktioniert. Es wäre auch sicher nicht falsch, wenn mal noch jemand anderes die Sache bei sich probiert und Rückmeldung erstattet. Vielleicht bin ich ja der Einzige, bei dem es nicht so will, wie es soll.

Datum: 16.06.2007-07:58

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Ich habe es jetzt mal andersrum probiert. Das Script auf dem Server installiert und auf dem Server ein Netzlaufwerk mit einer Freigabe vom Arbeitsrechner eingerichtet. Klappt genau so wenig. Das selbe Problem. Ich möchte wissen, was an Deiner Kiste anders ist, daß es funktioniert.

Datum: 16.06.2007-14:55

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
XAMPP ist ein Komplettpaket einer Entwicklungsumgebung, umfasst Apache, MySQL, Perl und PHP, das X steht fuer Cross-Platform (frueher LAMPP => Linux, WAMPP => Windows, Mac => MAPP2).
Es reicht das Paket in ein Wurzelverzeichnis eines Laufwerks zu entpacken, ein paar Pfade anzupassen und zu starten. Ein Webinterface erleichter die Administration der Dienste.
=> http://de.wikipedia.org/wiki/XAMPP

Kannst du dir auch leicht selbst ''installieren''.

Die XAMPP Webseite:
http://www.apachefriends.org/

Es ist keine Sache von Perl dass es nicht funktioniert, soll heiszen am Script selbst musst du nichts mehr aendern.

Wie ich schon sagte, es wird wohl an den Benutzerrechten liegen, damit meine ich nicht die Benutzerrechte mit denen du an der Maschine angemeldet bist, sondern die Benutzerrechte mit denen das Script ausgefuehrt wird.
Fuer anonymen Zugriff ist das bei IIS der Benuter IUSR_%COMPUTERNAME%, wobei %COMPUTERNAME% durch Namen der Maschine zu ersetzten ist.

Finde den Benutzer heraus mit dem das Script ausgefuehrt wird, das sollte sich in der Konfiguration von IIS herausfinden lassen (Rechtsklick auf das virtuelle Verzeichnis => Eigenschaften => Verzeichnissicherheit => "Steuerung des anonymen Zugriffs und der Authentifizierung" => Bearbeiten).

Ein anderer Weg, bau ein 'sleep 20;' an den Anfang deines Scripts ein, starte den Task-Manager, rufe das Script auf, finde im Task-Manager den Prozess mit dem die Scripte interpretiert werden ('perl.exe'), in der Spalte 'Benutzername' findest du den Benutzer mit dem das Script ausgefuehrt wird.

Aendere die Zugriffsrechte fuer das Netzlaufwerk, Rechtsklick auf das Laufwerk => Eigenschaften => Sicherheit => Hinzufuegen => gib den Benutzernamen in das Textfeld ein, gehe auf "Namen überprüfen" und auf "Ok".

Waehle den Benutzer aus der "Gruppen- oder Benutzernamen"-Liste aus und gib ihn "Ordner auflisten,Lesen,Ausfuehren" oder nur fuer diesen Test "Vollzugriff".

Bin gespannt wie's laeuft, ich haette es ja gerne unter meinen IIS getestet, hab ihn mir eben das erste mal installiert, das Problem ist nur dass Ich noch nicht ganz herausgefunden habe warum das Script nicht richtig ausgefuehrt wird.
Ich habe die Anwendungszuordnung gesetzt (.pl => C:\Perl\bin\perl.exe, das gleiche fuer .cgi), wenn ich das Script im Browser aufrufe wird auch ein Perlprozess gestartet (laesst sich im Task-Manager sehen), nur bleibt dieser mit der Ausfuehrung stehen, wartet vermutlich auf Input, gibt also auch nichts an den Webserver zurueck, dann erfolgt ein Timeout.

Im Ereignisprotokoll steht dann fuer den Dienst W3SVC:

Das Skript, das vom URL '/cgi-bin/test.cgi' mit den Parametern '' gestartet wurde, gab innerhalb der konfigurierten Zeitspanne keine Rückmeldung. Der HTTP-Server beendet das Skript.
Weitere Informationen zu dieser Meldung finden Sie in der Microsoft-Onlinesupportsite: http://www.microsoft.com/contentredirect.asp.

Weitere Informationen über die Hilfe- und Supportdienste erhalten Sie unter http://go.microsoft.com/fwlink/events.asp.

Datum: 16.06.2007-15:50

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Hi

Auch ich möchte mein gefährliches Halbwissen mal zum besten geben ;)

Das erste was mir in den Kopf kam .... Perl hat doch gar keinen eigenen Benutzer. Wie oben schon abgegeben wurde erbt es doch die Rechte vom Apache oder ISS User. Rechte anpassen fertig.

Wenn das nicht klappt gibts ja noch den Umweg das du eine Datenkommunikation ohne Freigaben benutzt. Z.b. Daten direkt über Script abfragen. Lesescript über Apache und ISS auf deinem Datenspeicher und ein Request Script auf der lesenden Maschine.

Vorteil dabei wäre das du sogar mit einer Linux Maschine kommunizieren kannst und dich um die Rechtevergabe nicht zu kümmern brauchst.

MFG Sonixx

Datum: 16.06.2007-23:37

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Danke auch für Deine Antwort. Wie schon vorher beschrieben, bringt Rechte anpassen nicht viel, da die bereits auf Vollzugriff stehen.

Deine andere Version mit den zwei Scripts ist interessant, aber für meinen Fall zu umständlich. Wenn es nur opendir() wäre, was nicht funktioniert, würde ich die Sache mit Sicherheit so lösen, aber ich brauche so sämtliche Dateioperationsfunktionen von Perl und die müsste ich alle mit einem solchen Script emulieren, was mir für meine lokale Testumgebung einfach zu kompliziert ist.

Vielleicht liegts auch tatsächlich am verwendeten Webserver, denn wenn ich über die Kommandozeile gehe, klappts ja. Soviel ich weiß, wird der Webserver da nicht mit einbezogen. Es wäre schön, wenn auch noch andere das Script mal auf dem IIS testen könnten.

Datum: 17.06.2007-09:49

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Okay

Doch bedenke ... nicht *Jeder* ist Jeder. Das war schon immer ein Punkt über den man stolpern konnte. Füge das Internetgastkto doch einfach mal der Zugriffsliste mit dem Attribut *Lesen* hinzu.

Schaden kanns nicht.

Übrigens ist es unter Windoof interessant Perl unter c:\usr zu installieren, da du dann ganz normal den Interpreterpath #!/usr/bin/perl benutzen kannst :)

MFG Sonixx

Datum: 17.06.2007-11:29

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Trotz aller Zweifel, hab ich das mal probiert, und wie ich es mir schon denken konnte, keine Veränderung. Ich weiß auch nicht, was es ändern soll, Perl in einem anderen Verzeichnis zu installieren. Im Moment ist es bei mir in C:\Perl und funktioniert.

Datum: 17.06.2007-11:45

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Ich habe mal folgendes ausprobiert:


my $cmd="perl -le \"opendir(DH, 'J:/') or die $!; print for readdir(DH);\"";
system($cmd);

Wenn ich lokale Laufwerke einsetze funktioniert es. Dabei ist es unerheblich, ob ich system(), exec() oder qx() benutze. Alle Netzlaufwerke führen zu dieser Fehlermeldung:


Can't locate object method "Bad" via package "file" (perhaps you forgot to load "file"?) at -e line 1.

Ich bin damit leider noch keinen Schritt weiter und es wird mal wieder die Theorie bestätigt, daß man Netzlaufwerke nicht wie lokale benutzen kann.

Datum: 17.06.2007-12:10

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Und, keine weiteren Meinungen? Dann scheint dieses Thema wie alle zu enden, die ich bisher mit dem selben Problem im Internet fand. Letzendlich schweigt man sich aus, oder es scheint keinen weiter zu interessieren. Kann nicht mal jemand das Script bei sich laufen lassen, wenn er eine in etwa identische Umgebung hat, und die Ergebnisse mal hier zum Besten geben?

Datum: 19.06.2007-05:44

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Hi

Sorry aber ich habe keine Netzwerkumgebung.

Eine weitere Möglichkeit wäre aber zum Beispiel auch eine temporäre Spiegelung, eine Art Caching.

Nach der Bearbeitung schreibt man dann die Datei zurück ....

Die verwirrenden Gedanken eines Morgens ....

Gäääähhhnnnnn :D

MFG Sonixx

Datum: 19.06.2007-06:02

Beitragre: opendir() auf Netzwerkfreigaben
Seitenanfang
Danke für die Erklärung von XAMPP. Hilft mir aber im Moment auch nicht weiter, da ich meine Umgebung nicht umbauen werde. Klar, hab mal geschaut. Das Script, wie alle anderen auch, wird mit dem Internetgastkonto ausgeführt. Allerdings hat bei mir 'Jeder' Vollzugriff. Deshalb hätte es mich schon gewundert, wenn durch Hinzufügen eines weiteren Benutzers mit entsprechenden Rechten sich was geändert hätte.

Was Deine Perl Intallation angeht, hast Du sie über das MSI installiert, oder manuell? Ich hatte mit manuellen Intallationen, zumindest von Active Perl, immer Probleme. Das Windows MSI bindet sich problemlos und sauber in die Systemumgebung ein. Das von Dir genannte Problem, daß das Script stehen bleibt, habe ich zwar auch schon gehabt, aber bei anderen Anwendungen (teils sporadisch), die ich bei Bedarf in einem neuen Thema gern ansprechen kann.

Datum: 17.06.2007-09:42

-






-
-