Alexander (HH): Über Expect.pm Dateien auf Linux-Remote-Host schreiben

Beitrag lesen

Moin Moin!

Danke für die ausführliche Antwort, aber ich gehe über mehrere Hops und hab unterschiedliche Dateien in unterschiedlichen Verzeichnissen.

Dann eben Datei für Datei. Mehrere Hops machen übrigens gar nichts, ssh kann man beliebig kaskadieren. Ein ssh-agent hilft dann, sich die Passwort-Eingabe zu schenken.

ssh user1@start ssh user2@hop1 ssh user3@hop2 ssh user4@ziel cat > /ziel/datei < /quelle/datei

Eine andere Technik ist mir neulich begegnet: Man richtet sich eine $HOME/.ssh/config ein, die beim ssh zum ersten Hop ein Portforwarding zum SSH-Port des nächsten Hop einrichtet. Dann reicht ein ssh zieluser@localhost -p 12345, und ssh tunnelt ssh.

Ich gebe zu, beide Techniken sind hervorragend geeignet, einen Knoten im Kopf zu bekommen.

Das ganze soll auch vom Webinterface aus steuerbar sein, da bin ich imho schon auf Perl angewiesen.

Wieso? CGIs müssen nicht in Perl geschrieben sein. Wenn Du mod_perl verwendest, ist das natürlich etwas schwieriger.

Aber selbst in Perl brauchst Du kein Expect:

  
my $pid=fork();  
die "Can't fork: $!" unless defined $pid;  
if ($pid) {  
  # parent  
  wait($pid);  
} else {  
  # child  
  close STDIN;  
  open STDIN,'<',$filename or die "Can't open $filename: $!";  
  exec '/usr/bin/ssh','user@host','cat','>',$destfilename;  
  # oder eben kaskadiert:  
  # exec '/usr/bin/ssh','user1@start','ssh','user2@hop1','ssh','user3@hop2','ssh','user4@ziel','cat','>',$destfilename;  
  die 'ssh failed: $!";  
}  

Net::SSH::Perl wäre eine Möglichkeit, komplett ohne fork() auszukommen.

Ich hab mir jetzt einen Workaround geschrieben, der alle Sonderzeichen, die auf der Konsole Probleme machen könnten durch Strings ersetzt und am Ende auf dem Zielhost ein Script zur Rückkonvertierung anstößt. Expect kann dann normal mit "echo $content > $file" arbeiten. Ist keine wirklich schöne Lösung, da sich die zu übertragende Datenmenge bei ersten Versuchen verdreifacht hat, aber es funktioniert und das sogar mit Binärdateien.

Base64-Encoding wäre noch eine Variante, kostet konstant 30% mehr Volumen. Aber ssh braucht das für STDIN/STDOUT/STDERR nicht, das ist 8-bit-clean. sz und rz gäbe es auch noch ... *schauder*

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".