Moin Moin!
Ganz ohne Perl auf jedem halbwegs brauchbaren Unix-System:
ssh user@remotehost cat '>' /some/where/a/file.ext < /home/ich/lade/mich/hoch.foo
(oder, je nach SSH und OS auf dem Remotehost:)
ssh user@remotehost sh -c 'cat > /some/where/a/file.ext' < /home/ich/lade/mich/hoch.foo
Der Trick ist, die Ausgabe-Umleitung von cat zu maskieren, so dass diese Umleitung auf dem Remote-Host stattfindet. cat bekommt als STDIN hoch.foo durch den ssh-Kanal, STDOUT wird auf dem Remotehost in die Zieldatei umgeleitet.
Der Trick funktioniert auch für mehrere Dateien, wenn man einen Packer zu Hilfe nimmt:
tar czf - -C /local/upload/directory | ssh user@remotehost tar xzvf - -C /remote/directory
Das erste tar wechselt ins Verzeichnis /local/upload/directory, packt alle Inhalte in einen TAR-Datenstrom und komprimiert den Datenstrom mit gzip (Parameter z), der schließlich nach STDOUT geschrieben wird (Parameter f -). Das geht via ssh als STDIN an das zweite Tar, das ins Verzeichnis /remote/directory wechselt und dort den Datenstrom wieder dekomprimiert und in Dateien und Verzeichnisse schreibt. Mit j (neuere Versionen) bzw. y (ältere Versionen) statt z wird statt gzip bzip2 benutzt, das oft besser komprimiert. Manche tar-Versionen können nicht selbst ein Komprimierungsprogramm aufrufen, dann läßt man z einfach weg oder bastelt gzip lokal und gunzip remote in den Datenstrom.
Natürlich funktionieren auch andere Formate wie z.B. cpio, aber TAR hat den Vorteil, ohne seek() auszukommen, im Gegensatz zu ZIP.
Wenn die Dateien nur geringfügig verändert werden müssen, wäre diff auf der lokalen Seite und patch auf der Remote-Seite ein Ansatz, das erfordert aber etwas Disziplin. Eleganter ist rsync, das auch wunderbar über eine SSH-Verbindung arbeiten kann:
rsync -avzu -e "ssh -l user" /local/upload/directory remotehost:/remote/directory
Damit wird das /remote/directory auf den Stand des /local/upload/directory gebracht, wobei auf beiden Seiten heftig gerechnet wird, aber nur minimale Datenmengen fließen.
Weitere hilfreiche Parameter für rsync:
-x bleibe im selben Dateisystem, gemountete Dateisysteme in Unterverzeichnissen werden ignoriert.
-H Hardlinks erkennen und remote anlegen (langsamer)
--progress Fortschrittanzeige
--copy-unsafe-links "Unsichere" Symlinks kopieren
--numeric-ids User und Group ID numerisch übertragen statt Namen zu vergleichen
rsync läuft (mit etwas Mühe) übrigens auch unter Windows. tar und gzip/gunzip sowieso. Kommandozeilen-SSH-Clients gibt es ebenfalls für Windows, z.B. plink aus dem PuTTY-Paket. Mit cygwin gibt es die gesamte Palette.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".