Text mit CGI auf fremden Host kopieren

flechte

Member
Hallo,
ich habe folgendes Problem:
Ein (restriktiver) Provider betreibt einen CGI-Server, wo die Nutzerverzeichnisse RO gemountet werden. Ein Dateiablage in /tmp ist ebenfalls nicht möglich.
Ich soll nun ein CGI-Script schreiben (bevorzugt Perl) welches eingebene Formulardaten aufbereitet und in eine Datei in einem Nutzerverzeichnis schreibt. Da dies auf dem CGI-Server nicht geht, muß ich also die Daten auf einen anderen Host transferieren.
Ein Versenden per Mail funktioniert, allerdings habe ich dann den Aufwand die Mail abzufangen (z.B. procmail), den Text rauszuschneiden und an das entsprechende file hinten dran zu hängen.
Ich wollte das gern mit ftp oder scp/ssh machen.
...
system "tar cf - buffer | ssh willi\@muster 'cd /home/willi/temp; tar xf -'"
...
Diese Variante funktioniert, solange buffer eine Datei ist.
Ist buffer eine Perl-Variable, geht es natürlich nicht, denn das wird wie ein langer string interpretiert (der auch \n u.a. enthalten kann).
Nun sollte dort sowas wie ein filehandle stehen. Damit sollten auch STDIN, STDOUT und STDERR möglich sein. Leider kann man tar nicht innerhalb einer Pipe verwenden, es muss immer am Anfang oder am Ende einer Pipe-Kette stehen.
Bin etwas ratlos.
Wie könnte man sowas anfassen ?

Ach ja. Ein Versenden an eine DB (MySQL o.a.) ist nicht praktikabel, da zuerst die Perl-Module fehlen und zweitens ich dann einen Extra-Rechner mit DB aufsetzen müßte. Den Zielhast kann ich nicht administrieren.
 
Zuletzt bearbeitet:
Hallo Lars,
leider nicht ganz die Lösung.
"tar cf - - " ???
Sowas geht nicht, da "f -" ja schon den STDIn belegt.
Laut manpage muss tar immer am Anfang oder Ende einer Pipe stehen !
An der Stelle muss ein filehandle hin.

...
***************
chomp?
***************
....
Auch nicht so das, was ich wollte. Dadurch geht die gesamte Formatierung
des Formulars verloren. (Für WIN-User vollkommen unannehmbar.)
Ich müßte dann einen parser schreiben, der mir das Formular auf dem Zielhost wieder herstellt. Der Aufwand wird einfach zu hoch.
Dann kann ich es gleich per Mail verschicken und auf dem Zielhost behandeln, das ist einfacher.

Ich hab immer noch nicht die rechte Idee.

Danke.
 
@flechte:
Erst dachte ich "chomp" wäre die Lösung, ist es aber nicht.
Und löschen konnte ich den Post nicht mehr, daher "-" als "no text".

-
hat also nichts zu bedeuten, sorry ;-)
 
@lars:
Bitte den Post nicht einfach komplett leer machen. Du kannst ja stattdessen in Rot drunter schreiben "War leider falsch" oder so. :)
 
Hallo,

Ahhh, eine Programmieraufgabe fuer mich :)
flechte schrieb:
[...]
Ich wollte das gern mit ftp oder scp/ssh machen.
...
system "tar cf - buffer | ssh willi\@muster 'cd /home/willi/temp; tar xf -'"
...
Hmm, also das ganze per ssh zu transferieren ist ja venuemftig, aber warum tar ?
Wegen der "pipe" ?
Diese Variante funktioniert, solange buffer eine Datei ist.
Ist buffer eine Perl-Variable, geht es natürlich nicht, denn das wird wie ein langer string interpretiert (der auch \n u.a. enthalten kann).
Nun sollte dort sowas wie ein filehandle stehen. Damit sollten auch STDIN, STDOUT und STDERR möglich sein. Leider kann man tar nicht innerhalb einer Pipe verwenden, es muss immer am Anfang oder am Ende einer Pipe-Kette stehen.
Bin etwas ratlos.
Wie könnte man sowas anfassen ?
Mit einpaar open´s und einwenig "IPC"/pipes.
Gibt da viele Moeglichkeiten unter Perl.
Hier mal ein Beispiel:
....
my $pid = open(WRITE, "| ssh willi\@muster 'cat > ~/tmp/testdatei'") or die "Fehler bei fork: $!\n";
print WRITE "lalalala hier kommen die Daten laalalal";
close(WRITE) or die "Fehler bei fork: $!\n";
....

Gruss
Joerg B.
 
Danke !

Hallo,

ich war leider durch Unfall aus dem Verkehr gezogen, deshalb die späte Antwort.

@MateJunk
Genial. Ich hatte schon mit dem Gedanken gespielt, war aber zu dumm es zum laufen zu kriegen. Aber Dein Beispiel funktioniert einwandfrei.
Danke !
 
Zurück
Oben