Hallo,
Was ist STDERR? Wo wird das hingeschrieben? Geht das automatisch, oder wie bekomme ich das in eine Log-Datei?
Auf vielen System stehen den Programmen (also auch Scripts, Batchdateiene usw.) 3 Standard-'Datei'-Handles zur Verfügung. STDIN ist die Standardeingabe, STDOUT ist die Standardausgabe, und STDERR ist die Fehlerausgabe. STDERR wurde nicht ohne Grund von der StDOUT abgekoppelt. Wenn Du beispielsweise in einer Shell arbeitest, so ist STDIN die Tastatur, STDOUT und STDERR der Konsolen-Schirm. Interessant wird es erst, wenn DU eine sog. Ein- bzw. Ausgabeumleitung vornimmst. Dabei kannst beispielsweise STDOUT auf eine wirkliche Datei umleiten.
Öffne einmal unter Windows eine Commandshell (äh. Eingabeaufforderung) und gib' folgendes ein
c:> dir /s /b \ >x.x
Jetzt wird der Rechner wie wild werkeln und am Schirm passiert gar nichts. Nach Beendigung dieses Befehls existiert allerdings eine Datei namens x.x, in der dann fein säuberlich alle Dateinamen aufgeführt sind, welche auf dem Laufwerk C vorhanden sind. Das Geheimnis ist das ominöse '>x.x'. Das leitet die Ausgabe, welche normalerweise im Konsolenfenster erfolgt, auf die Datei x.x um. '>>x.x' würde an die Datei anhängen, '<x.x' von der Datei lesen. Um STDERR umzuleiten mußt Du '2>x.x' schreiben.
Der sinn von STDERR ist, daß das ausgeführte Programm die Möglichkeit hat, die Fehlermeldungen getrennt von der normalen Ausgabe vorzunehemen. Dadurch kann bei der Ausgabeumleitung eben Fehlermeldungen auch in eine andere Datei umgeleitet werden.
Ich habe das in meinem Beisiel weiter unten so gemacht.
Was ich noch dazu sagen muß, auf dem Win2K Rechner ist Apache/PHP/PERL/MySQL auch für andere Zwecke installiert. Der Rechner steht in einem LAN und bekommt Anfragen per Port-Forewarding vom Internet durch den Router weitergeleitet. Auf dem Apache ist ein Intra-/Extranet installiert, noch kein großes, aber es wird ausgebaut. Und das hatte ich gedacht, könnte man ja ausnutzen, für die Datenübertragung. Im Prinzip ist es mir egal von wo die Aktion jetzt ausgeht, nur halte ich es für sicherer Remote per SSH auf den Unix-Server zuzugreifen, als auf den Win2K Rechner.
Ob nun auf dem Rechner ein Webserver installiert ist oder nicht, iszt IMHO für Deine Belange unerheblich, da ich den Datenaustausch sowieso ohne Webserver erledigen würde. Eine Batchdatei per 'geplante Tasks' ist für diesen Anwendungsfall sicherlich die bessere Wahl. Es muß ja nicht immer HTTP sein;-)
Da der Windows-Rechner ja wie beschrieben hinter einem Router steht, gibt es da Probleme mit irgendwelchen Ports? Eigentlich ja nicht, oder? Ist ja nur bei Serverprogrammen das Problem, oder?
Das kann ohne genaue Kenntnis der Routerkonfiguration keiner hier zweifelsfrei beantworten. Aber probier einfahc einmal
plink -ssh dein.linux.rechner.de -l username -pw passwort ls
aus.
wenn du dann ein Verzeichnislisting des Linux-Rechners siehst, dann hast Du IMHO schon gewonnen.
Aber wenn die Dateien im Klartext vorliegen, könnte man ja auf die Idee kommen, das ganze über HTTPS abzuwickeln, und einfach die Inhalte in den POST - Header schreiben, oder? Nur mal angenommen die Datenmenge ist nicht so groß, das man ein Timeout riskiert, würdet Ihr immer noch die Lösung mit plink und dem anderen putty Tool vorziehen?
plink kann eben auch (per ssh) verschlüsselte Daten übertragen, was eine SSL-Konfiruration und zusätzliche Sicherungsmaßnahmen am Webserver für diesen Zweck nicht notwendig machen würde. Du mußt ja bedenken, daß, wenn Du den Webserver verwenden willst, diesen auch entsprechend absichern mußt, damit kein fremder Dir die Austauschdaten absaugt. Und Basic-Authentication ist IMHO kein wirklich sicheres Verfahren.
Beispiel:
plink remotehost -l user -pw geheim verarbeitungsscript.pl >daten.txt 2>fehlermeldungen.txt
Das geht? nicht schlecht!
Ja, sonst hätte ich das Beispiel nicht angeführt;-)
fehlermedlung.txt wird dann auf den Win-Rechner geschrieben, oder?
Richtig, und es enthält alles was verarbeitungsscript.pl auf STDERR schreibt.
Und das Verarbeitungsscript.pl wird ausgeführt, und was ist daten.txt?
verarbeitungsscript.pl läuft auf dem Linux-Rechner und daten.txt enthält alles, was das Script auf STDOUT schreibt, und liegt dann auf deinem Windows-Rechner.
Oder meinst Du damit, das die Ausgabe des PERL-Scriptes direkt in eine Datei umgeleitet wird, aber mache ich sowas nicht lieber im PERL-Script diekt?
Die Ausgabe des Perlscripts am Server wird eben in eine Datei auf dem Clientrechner umgeleitet.
Muß ich dann überhaupt danach noch kopieren?
Nein, das macht es IMHO so interessant.
Ich denke da an ein Script auf dem Linux-Rechner, welches alle relevanten Daten sammelt und an STDOUT schreibt (einfach 'print....' in Perl).
Sollte irgendwas daneben gehen, dann schreibt es die Fehlermeldungen an STDERR (dann eben 'print STDERR ...', oder auch 'die ....')
Lokal wird mit plink dieses Script angeworfen und die Daten in zwei Dateien geschrieben (eine für STDOUT und eine für STDERR, so wie in meinem Bespiel). Diese Dateien werden dann lokal nach belieben verarbeitet. Das alles erledigt eben lokal eine Batchdatei oder ein Script.
Noch kurz etwas zu Batchdateien: Du kennst sicherlich die ominöse Autoexec.bat aus DOS/Win9x-Zeiten). Das ist eine Batchdatei. sie enthält nicht weiter als eine Ansammlungen von Befehlen, die Du auch in der Command-Shell eingeben könntest. Außerdem kannst Du noch einige Konntrollstrukturen verwenden, aber wirklich Mächtig sind Batchdateien unter Windows nicht. Eigentlich sind das ganz simpel gestrickte Scripts. Scriptsprachen wie Perl sind einfahc nur wesentlcih mächtiger in ihren Möglichkeiten. [1]
Was für Sessions meinst Du? Und was für Keys? Meinst Du PGP-Verschlüsselungen? wofür braucht man das noch? Ich will doch nur ein Scruipt auf der Unix-Maschine ausführen, welches Dateien erzeugt, und wenn dieses Script fertig ist, werden diese Dateien durch Putty per SSH übertragen. Wofür braucht man da noch Sessions oder weitere Verschlüsselungsmechanismen?
Irgendwie kann plink auch Zugangskonfigurationen verwenden, ich vermute die, die Du auch mit putty verwenden kannst. Und dann gibt's da auch noch eine Public-Key-Authentication für SSH, mit der Du vermutlich die Passwort-Geschichte vergessen kannst, um Dich am Server zu authentifizeren. Aber damit habe ich mich noch zu wenig auseinandergesetzt, um nicht auch totalen Blödsinn zu verzapfen.
Grüße
Klaus
[1] Da fällt mir ein, daß wir schon vor längerer Zeit über PHP vs. Perl diskutiert haben, und ich habe Dir damals prophezeit, daß irgendwann der Punkt kommen wird, wo Du bemerken wirst, daß es gut ist Perl zu können, da es auch außerhalb des Webumfeldes viele Anwendungen geben wird, wo es sinnvoll eingesetzt werden kann. Jetzt ist es so weit;-) [2]
[2] Wobei wahrscheinlich auch PHP für sowas vergenußwurzelt werden könnte.