Stefan Welscher: Perl-Expect - Binärdateien übertragen?

Hallo,
ich hab grad folgendes Problem:
Bei uns gibt es zwei Netzwerke zwischen denen ich Dateien übertragen will. Zwischen den Netzen gibt es kein Routing, die einzige (nutzbare) Verbindung zwischen den Netzwerken ist eine Linux-Maschine, die nur über SSH erreichbar ist und auf der nur die Commandos "ssh" und "telnet" freigegeben sind.
Jetzt hab ich mir in Perl mit Hilfe von Expect.pm ein Script geschieben, welches sich mit ssh zum Zielrechner "durcharbeitet" und dort Konsolenbefehle absetzt. Über "cat" kann ich dann Textdateien ausgeben lassen und die Ausgaben abfangen und auf dem Quellrechner abspeichern.

Das funktioniert soweit prima, allerdings stoße ich auf ein Problem, wenn ich Nicht-Textdateien (tar.gz, iso, jpg) übertragen will.
Gibt es eine Möglichkeit auch diese Dateien auf diesem oder einem anderen Weg zu übertragen?

  1. Moin!

    Bei uns gibt es zwei Netzwerke zwischen denen ich Dateien übertragen will. Zwischen den Netzen gibt es kein Routing, die einzige (nutzbare) Verbindung zwischen den Netzwerken ist eine Linux-Maschine, die nur über SSH erreichbar ist und auf der nur die Commandos "ssh" und "telnet" freigegeben sind.

    Telnet lassen wir mal außen vor (kann man damit überhaupt Dateien übertragen?), aber SSH ist doch schon in Ordnung. Zu SSH gehört auch ein passendes Kopierprogramm, scp. Funktioniert das denn?

    Jetzt hab ich mir in Perl mit Hilfe von Expect.pm ein Script geschieben, welches sich mit ssh zum Zielrechner "durcharbeitet" und dort Konsolenbefehle absetzt. […] Das funktioniert soweit prima, allerdings stoße ich auf ein Problem, wenn ich Nicht-Textdateien (tar.gz, iso, jpg) übertragen will.

    Wenn scp nicht funktioniert und du tatsächlich auf Perl angewiesen bist, solltest du im so genannten »binmode« arbeiten, dann werden Dateiein- und ausgaben als Binärdaten behandelt und es tritt keine „Zeilenende-Magie“ in Kraft.

    Schönes Wochenende,
    Robert

    1. Telnet lassen wir mal außen vor (kann man damit überhaupt Dateien übertragen?), aber SSH ist doch schon in Ordnung. Zu SSH gehört auch ein passendes Kopierprogramm, scp. Funktioniert das denn?

      Nein, leider nicht

      Wenn scp nicht funktioniert und du tatsächlich auf Perl angewiesen bist, solltest du im so genannten »binmode« arbeiten, dann werden Dateiein- und ausgaben als Binärdaten behandelt und es tritt keine „Zeilenende-Magie“ in Kraft.

      Also auf der Quellmaschine kann ich nahezu installieren was ich will.
      Wenn es z.B. mit PHP leichter zu realisieren ist kann ich auch das nehmen. Das mit dem "binmode" hört sich aber schonmal gut an.
      Wie kann ich den denn nutzen???

      1. Wenn es z.B. mit PHP leichter zu realisieren ist kann ich auch das nehmen. Das mit dem "binmode" hört sich aber schonmal gut an.
        Wie kann ich den denn nutzen???

        perldoc binmode

        Struppi.

        1. Wenn es z.B. mit PHP leichter zu realisieren ist kann ich auch das nehmen. Das mit dem "binmode" hört sich aber schonmal gut an.
          Wie kann ich den denn nutzen???

          perldoc binmode

          Struppi.

          Dazu bräuchte ich aber doch einen Filehandle?
          Ich hab ja nur ein Expect-Object.

          Evtl. hilft es mal den Code dazu zu sehen (funktioniert eben nur mit Textfiles):

            
          sub get_cops_web  
          {  
           my ($file,$user,$password,$logfile,$debug) = @_;  
           $user=~s/\s*\r*\n*//g;  
           $password=~s/\s*\r*\n*//g;  
           $file=~s/\s*\r*\n*//g;  
           $file=~s/\.\.//g;  
           $file=~s/^([a-z]+:[\/]+)*(\d+\.\d+\.\d+\.\d+)*\///g;  
           if ($file!~/^[a-z0-9%?&=\/_-]+\.[a-z0-9%?&=_-]+/i) { print "\nInvalid file!\n"; return 0; }  
            
           my $path="/srv/www/htdocs/";  
           $file=$path.$file;  
           my $local_tmp="/opt/vpn/CoCA/TEMP/";  
            
           my $logfile="/opt/vpn/logs/copsweb_log_".$user;  
           my $screen_log=0;  
            
           $|=1;  
            
           my $telnet;  
           $telnet=&ssh_nipc1($telnet,$user,$password,'',$logfile,$screen_log,$debug);  
           $telnet->debug($debug);  
           $telnet->log_file($logfile);  
           $telnet->log_user(1);  
           $telnet->log_stdout($screen_log);  
            
           my $good = "^[a-zA-Z]+\@nipc1:~>";  
           my $bad  = 'o such file or directory|ould not open';  
           print $telnet "/usr/bin/php /srv/www/htdocs/cops/coca_overlay.php ".$file."\r\n";  
           my ($match_num,$error,$match,$before,$after) = $telnet->expect(40,'-re',$good,'-re',$bad);  
            
           &close_nipc1($telnet,$user,$password,'',$logfile,$screen_log,$debug);  
            
           if ($match=~/$bad/i) { return 0; }  
            
           my @before=split(/\r\n/,$before);  
           my @tmp_file; my $tmp_file_cnt=0; my $line; my $skip_first_line=1;  
           foreach $line (@before)  
           {  
            if ($skip_first_line || $line=~/^\s*[a-zA-Z]+\@nipc1:~>/) { $skip_first_line=0; next; }  
            $line=~s/\r*\n*//g;  
            $tmp_file[$tmp_file_cnt++]=$line;  
           }  
            
           my $sequence;  
           if (!$tmp_file_cnt)  
           {  
            $sequence=0;  
            $tmp_file[0]="Error reading file ".$file."!";  
            $tmp_file_cnt=1;  
           }  
           else  
           { $sequence=&create_random_sequence(32); }  
            
           open (DESTINATION, ">", $local_tmp."copsweb_".$sequence) or die "Error writing file copsweb_".$sequence."! \n$!\n";  
           for (my $a=0; $a<$tmp_file_cnt; $a++)  
           { print DESTINATION $tmp_file[$a]."\r\n"; }  
           close (DESTINATION);  
           return $sequence;  
          }  
          
          
          1. Struppi.

            Bitte zitiere nur das worauf dein Antwort sich bezieht, Danke.

            Dazu bräuchte ich aber doch einen Filehandle?
            Ich hab ja nur ein Expect-Object.

            Damit kenn ich mich nicht aus, aber du hast bisher auch nur geschrieben:

            Das funktioniert soweit prima, allerdings stoße ich auf ein Problem, wenn ich Nicht-Textdateien (tar.gz, iso, jpg) übertragen will.

            Wobei du nicht sagst was das Problem ist.

            open (DESTINATION, ">", $local_tmp."copsweb_".$sequence) or die "Error writing file copsweb_".$sequence."! \n$!\n";

            Ich dachte du hast keinen Dateihandle?

            Struppi.

            1. Bitte zitiere nur das worauf dein Antwort sich bezieht, Danke.

              Du bist aber schon ein wenig pingelig?

              open (DESTINATION, ">", $local_tmp."copsweb_".$sequence) or die "Error writing file copsweb_".$sequence."! \n$!\n";
              Ich dachte du hast keinen Dateihandle?

              Da ist es ja schon zu spät, weil der binäre Content an der Stelle schon falsch im Array liegt.

              Hab jetzt grad beim Suchen noch eine Option entdeckt die evtl. funktionierten könnte: $telnet->raw_pty(1|0)
              Mal sehen, ob ich damit weiter komme...

              1. Bitte zitiere nur das worauf dein Antwort sich bezieht, Danke.
                Du bist aber schon ein wenig pingelig?

                Das hat nichts mit pingelig zu tun, ich lese ja nicht nur deine Nachrichten und hab wenig Bock bei allen Antowrten die kommen erst mal suchen zu müssen wo die Antwort steht und worauf diese sich bezieht.

                Es ist also einfach eine Frage deiner Höflichkeit gegenüber den Leuten von denen du Unterstützung erwartest, mehr dazu findest du in der Charta

                open (DESTINATION, ">", $local_tmp."copsweb_".$sequence) or die "Error writing file copsweb_".$sequence."! \n$!\n";
                Ich dachte du hast keinen Dateihandle?
                Da ist es ja schon zu spät, weil der binäre Content an der Stelle schon falsch im Array liegt.

                Ohne zu Wissen, was überhaupt das Problem ist läßt sich natürlich nur schwer sagen wo du ansetzen musst.

                Hab jetzt grad beim Suchen noch eine Option entdeckt die evtl. funktionierten könnte: $telnet->raw_pty(1|0)

                Du meinst beim suchen in der Doku?

                Struppi.

                1. Hab jetzt grad beim Suchen noch eine Option entdeckt die evtl. funktionierten könnte: $telnet->raw_pty(1|0)

                  Du meinst beim suchen in der Doku?

                  Ja, genau da hab ich es gefunden, funktioniert aber leider nicht so wie ich mir das vorstelle.

                  Ich versuch nochmal etwas genauer auf das Problem einzugehen um es verständlicher zu machen:

                  Ich möchte in LAN A die Dateien von LAN B abrufen können.
                  Das betrifft z.B. aktuell das Webinterface in LAN B, welches Dateien verschiedener Art (.txt, .tar, .tar.gz, .iso, .jpg) zur Verfügung stellt. Die einzige Möglichkeit zwischen den LANs zu kommunizieren ist von LAN A eine SSH-Session (kein SCP) zu einem Zwischenhop zu spannen und von dort aus eine SSH-Verbindung zum eigentlichen Server in LAN B herzustellen.

                  Ich habe mir jetzt ein Perl-Script (copsweb.pl - sub get_cops_web) geschrieben, welches über Expect eine Session zum Zwischenhop aufbaut (sub ssh_unix_level1) und sich von dort aus weiter auf den Server in LAN B aufwählt (sub ssh_nipc1).

                  Das Perl-Script wird von einem PHP-Script (index.php) aufgerufen, da ich meine CGI-Gehversuche kläglich gescheitert sind.

                  Auf dem Zielrechner in LAN B liegt eine PHP-Datei (coca_overlay.php), welche die über die Konsole übergebenen Argumente entgegennimmt und anschließend die eigentlichen PHP-Dateien des Webinterfaces einbindet.

                  Über Expect stoße ich dann die coca_overlay.php an und fange den Output des PHP-Scriptes ab.

                  Das Perlscript gibt die lokal angelegte Datei aus und ändert ggf. noch die URLs, wenn es sich um eine anzuzeigende PHP/HTML-Datei handelt.

                  Das funktioniert bei Textdateien (.txt und .tar) wunderbar, aber nicht mehr, wenn ich binäre Dateien (.tar.gz, .iso, .jpg) übertragen will.
                  Dann bekomme ich nur Krautsalat.

                  Nochmal als Summary:

                  index.php ->LAN A
                  |
                  copsweb.pl ->LAN A
                  |
                  FEX.pm (ssh_unix_level1; ssh_nipc1) ->LAN A
                  |
                  coca_overlay.php ->LAN B
                  |
                  Dateien des Zielhosts -> LAN B

                  Die Quelltext folgen gleich (Post ist sonst zu groß zum absenden :/ )

                  1. index.php
                    ---------

                      
                    <?  
                    $url=preg_replace("/\s*|[^a-z0-9%?&=\/._-]+/i","",$url);  
                    if (!$url) { $url="cops/index.htm"; }  
                      
                    #Sonderausgabe fuer Downloads:  
                    if (preg_match("/cops\/get_download.php/",$url))  
                    {  
                     $file=preg_replace("/^(.*file=)([^&]*)(.*?)$/","$2",$url);  
                     $file_tail=preg_replace("%^(.*?/)([^/]*)$%","$2",$file);  
                     header("Content-Type: application/octet-stream");  
                     header("Content-Disposition: attachment; filename=\"$file_tail\"");  
                    }  
                      
                    $output=popen("/srv/www/htdocs/cops/copsweb.pl $url 2>&1", 'r');  
                    while(!feof($output))  
                    {  
                     echo $line=fgets($output);  
                    }  
                    pclose($output);  
                    ?>  
                    
                    

                    copsweb.pl:
                    -----------

                      
                    #!/usr/bin/perl  
                      
                    use strict;  
                    use lib ("/opt/vpn/CoCA/");  
                    use FEX;  
                      
                    my $url=$ARGV[0];  
                    $url=~s/\s*\r*\n*//g;  
                    $url=~s/\.\.//g;  
                    $url=~s/^([a-z]+:[\/]+)*(\d+\.\d+\.\d+\.\d+)*\///g;  
                    $url=~s/[^a-z0-9%?&=\/._-]+//gi;  
                      
                    my $logfile; my $debug;  
                    my $sequence=&get_cops_web($url,"user","password",$logfile,$debug);  
                      
                    #print $size;  
                    open(FH,"<","/opt/vpn/CoCA/TEMP/copsweb_".$sequence) or die ("could not open /opt/vpn/CoCA/TEMP/copsweb_".$sequence."\n".$!."\n");  
                      
                    if ($url=~/\.(php[345]?|html?)(\?|$)/i && $url!~/get_download\.php\?file=/i)  
                    {  
                     my $line;  
                     while ($line=<FH>)  
                     {  
                      #Parsing Frameset-URLs  
                      if ($line=~/^(.*<\s*frame\s([^>]+\s)?src\s*=\s*)("([^">]+)"|'([^'>]+)'|([^"'>]+))(.*)$/i)  
                      {  
                       my $url1=$1; my $url2=$3; my $url3=$7;  
                       $url2=~s/["']*//g;  
                      
                       $line=$url1."\"index.php?url=cops/".$url2."\"".$url3;  
                      }  
                      
                      #Parsing Anchor-Tags  
                      if ($line=~/^(.*<\s*a\s([^>]+\s)?href\s*=\s*)("([^">]+)"|'([^'>]+)'|([^"'>]+))(.*)$/i)  
                      {  
                       my $url1=$1; my $url2=$3; my $url3=$7;  
                       $url2=~s/["']*//g;  
                      
                       $line=$url1."\"index.php?url=cops/".$url2."\"".$url3;  
                      }  
                      
                      #Parsing JavaScript-URLs:  
                      if ($line=~/^(.*window\.open\(["'])([^"']+)(.*)$/i)  
                      {  
                       $line=$1."index.php?url=cops/".$2.$3;  
                      }  
                      
                      print $line;  
                     }  
                     close (FH);  
                    }  
                    else  
                    {  
                     my $size=-s '/opt/vpn/CoCA/TEMP/copsweb_'.$sequence;  
                     my $file='';  
                      
                     binmode(FH);  
                     my $return=read(FH,$file,$size);  
                     close (FH);  
                     print $file;  
                    }  
                    
                    
                  2. FEX.pm:
                    -------

                      
                    sub get_cops_web  
                    {  
                     my ($file,$user,$password,$logfile,$debug) = @_;  
                     $user=~s/\s*\r*\n*//g;  
                     $password=~s/\s*\r*\n*//g;  
                     $file=~s/\s*\r*\n*//g;  
                     $file=~s/\.\.//g;  
                     $file=~s/^([a-z]+:[\/]+)*(\d+\.\d+\.\d+\.\d+)*\///g;  
                     if ($file!~/^[a-z0-9%?&=\/_-]+\.[a-z0-9%?&=_-]+/i) { print "\nInvalid file!\n"; return 0; }  
                      
                     my $path="/srv/www/htdocs/";  
                     $file=$path.$file;  
                     my $local_tmp="/opt/vpn/CoCA/TEMP/";  
                      
                     my $logfile="/opt/vpn/logs/copsweb_log_".$user;  
                     my $screen_log=0;  
                      
                     $|=1;  
                      
                     my $telnet;  
                     $telnet=&ssh_nipc1($telnet,$user,$password,'',$logfile,$screen_log,$debug);  
                     $telnet->raw_pty(1);  
                     $telnet->debug($debug);  
                     $telnet->log_file($logfile);  
                     $telnet->log_user(1);  
                     $telnet->log_stdout($screen_log);  
                      
                     print $telnet "export PS1=\"\"\r";  
                     $telnet->expect(5,'-re',"\r*\n*nipc1:~> \s*\r*\n*");  
                      
                     my $good="EXPECT_EOF";  
                     my $bad  = 'o such file or directory|ould not open';  
                     my $command="/usr/bin/php /srv/www/htdocs/cops/coca_overlay.php $file && echo \"EXPECT_EOF\"\r";  
                     print $telnet $command;  
                     my ($match_num,$error,$match,$before,$after) = $telnet->expect(40,'-re',$good,'-re',$bad);  
                      
                     print $telnet "export PS1=\"\\u@\\h:\\w>\"\r";  
                     $telnet->expect(10,'-re',"\r*\n*nipc1:~>\s*\r*\n*");  
                      
                     &close_nipc1($telnet,$user,$password,'',$logfile,$screen_log,$debug);  
                      
                     my $sequence;  
                     if ($match=~/$bad/i) { $before="Could not read file $file in FEX.pm\r\n\r\n$match"; $sequence=0; }  
                     else { $sequence=&create_random_sequence(32); }  
                      
                     open (DESTINATION, ">", $local_tmp."copsweb_".$sequence) or die "Error writing file copsweb_".$sequence."! \n$!\n";  
                     binmode(DESTINATION);  
                     print DESTINATION $before;  
                     close (DESTINATION);  
                      
                     return $sequence;  
                    }  
                      
                      
                      
                    sub ssh_unix_level1  
                    {  
                     my ($telnet,$host,$hostname,$user,$password,$ra_meldungen,$logfile,$screen_log,$debug) = @_;  
                     $user=~s/\s*\r*\n*//g;  
                     $password=~s/\s*\r*\n*//g;  
                      
                     if (!$hostname)  
                     {  
                      if ($host eq "1.1.1.1")  { $hostname="hop1"; }  
                      elsif ($host eq "1.1.1.2") { $hostname="hop2"; }  
                      elsif ($host eq "1.1.1.3") { $hostname="hop3"; }  
                     }  
                      
                     my $lockfile="/opt/vpn/locks/".(lc($hostname))."_anwahl_".$user;  
                     my $logfile="/opt/vpn/logs/".(lc($hostname))."_log_".$user;  
                      
                     open LOCKDATEI, "> $lockfile" or die "$! FEX::hop1_anwahl kann Datei $lockfile nicht oeffnen\n";  
                     flock(LOCKDATEI,LOCK_EX);  
                     print LOCKDATEI (lc($hostname))."\n";  
                      
                     $|=1;  
                      
                     ### Expect Objekt erzeugen, wenn direkte Anwahl, ansonsten per  
                     ### telnet vom bereits geoeffneten Objekt loslegen.  
                     my $ref_tel=ref($telnet);  
                     if ($ref_tel ne "Expect")  
                     {  
                      $Expect::Log_Stdout= $screen_log;  
                      $telnet=new Expect;  
                      $telnet->raw_pty(1);  
                      $telnet->slave->stty(qw(raw -echo));  
                      $telnet->spawn("/usr/bin/ssh ".$user."@".$host) or die "konnte SSH nicht starten $!\n";  
                      $telnet->debug($debug);  
                      $telnet->log_file($logfile);  
                      $telnet->log_user(1);  
                      $telnet->log_stdout($screen_log);  
                     }  
                     else  
                     { print $telnet "ssh ".$user."@".$host."\n"; }  
                      
                     my $good1 = 'Are you sure you want to continue connecting (yes\/no)?';  
                     my $good2 = 'Password:';  
                     my $good = $good1."|".$good2;  
                     my $bad  = 'Unable to connect|connection refused|ad passwords|onnection closed|Unknown host|onnection timed|not known';  
                     my ($match_num,$error,$match,$before,$after) = $telnet->expect(5,'-re',$good,'-re',$bad);  
                      
                     if    ($match=~/$bad/i)  { $telnet->hard_close(); }  
                     elsif ($match=~/$good1/i)  
                     {  
                      print $telnet "yes\r";  
                      ($match_num,$error,$match,$before,$after) = $telnet->expect(5,'-re',$good2,'-re',$bad);  
                     }  
                      
                     if ($match=~/$good2/i)  
                     {  
                      print $telnet $password."\r\n";  
                      $bad.="|Password:";  
                      $good="\@".$hostname.":~>";  
                      ($match_num,$error,$match,$before,$after) = $telnet->expect(5,'-re',$good,'-re',$bad);  
                      
                      if    ($match=~/$bad/i)  { $telnet->hard_close(); }  
                      elsif ($match=~/$good/i)  
                      {  
                       $telnet->log_user(1);  
                       flock(LOCKDATEI,LOCK_UN);  
                       close LOCKDATEI;  
                       return $telnet;  
                      }  
                     }  
                     else { $telnet->hard_close(); }  
                      
                     flock(LOCKDATEI,LOCK_UN);  
                     close LOCKDATEI;  
                     print "\n\nProblem: Einloggen auf ".(lc($hostname))." war nicht erfolgreich !!!\n\n";  
                     return 0;  
                    }  
                      
                      
                      
                      
                    sub close_unix_level1  
                    {  
                     my ($telnet,$host,$user,$password,$ra_meldungen,$logfile,$screen_log,$debug)=@_;  
                     $telnet->raw_pty(1);  
                     $telnet->debug($debug);  
                     $telnet->log_file($logfile);  
                     $telnet->log_user(1);  
                     $telnet->log_stdout($screen_log);  
                      
                     $|=1;  
                     my $hostname;  
                     if ($host eq "1.1.1.1")  { $hostname="hop1"; }  
                     elsif ($host eq "1.1.1.2") { $hostname="hop2"; }  
                     elsif ($host eq "1.1.1.3") { $hostname="hop3"; }  
                     elsif ($host=~/[a-z]+/i)  { $hostname=$host; }  
                      
                     my $logfile="/opt/vpn/locks/".$hostname."_log_".$user;  
                     my $ref_tel=ref($telnet);  
                     if ($ref_tel eq "Expect")  
                     {  
                      print $telnet "exit\r";  
                      my $good = "closed";  
                      my $bad  = 'not found|unknown';  
                      my ($match_num,$error,$match,$before,$after) = $telnet->expect(20,'-re',$good,'-re',$bad);  
                      
                      if ($match=~/$bad/i)  
                      {  
                       print $telnet "quit\r";  
                       $good = "closed";  
                       $bad  = 'not found|unknown';  
                       ($match_num,$error,$match,$before,$after) = $telnet->expect(20,'-re',$good,'-re',$bad);  
                      }  
                      $telnet->soft_close();  
                      $telnet->hard_close();  
                     }  
                     return 1;  
                    }  
                      
                      
                      
                    sub ssh_nipc1  
                    {  
                     my ($telnet,$user,$password,$ra_meldungen,$logfile,$screen_log,$debug) = @_;  
                      
                     my $lockfile = "/opt/vpn/locks/nipc1_anwahl_$user";  
                     my $logfile = "/opt/vpn/logs/nipc1_log_$user";  
                     my $host="1.1.1.4";  
                      
                     open LOCKDATEI, "> $lockfile" or die "$! FEX::nipc1_anwahl kann Datei $lockfile nicht oeffnen\n";  
                     flock(LOCKDATEI,LOCK_EX);  
                     print LOCKDATEI "nipc1\n";  
                      
                     $|=1;  
                      
                     #Trying Unix hosts (official gates)  
                     my $count=0; my $count2=0;  
                     my @hop_ips=  ("1.1.1.1", "1.1.1.2", "1.1.1.3");  
                     my @hop_hostnames=("hop1",        "hop2",        "hop3");  
                      
                     for ($count=0;$count<99;$count++)  
                     {  
                      if (!$hop_ips[$count] || !$hop_hostnames[$count]) { $count=99; last; }  
                      
                      for ($count2=0;$count2<3;$count2++)  
                      {  
                       $telnet=&ssh_unix_level1($telnet,$hop_ips[$count],$hop_hostnames[$count],$user,$password,$ra_meldungen,$logfile,$screen_log,$debug);  
                       if (ref($telnet) eq "Expect") { $FEX::pre_logfile="/opt/vpn/logs/".(lc($hop_hostnames[$count]))."_log_".$user; $FEX::pre_host=lc($hop_hostnames[$count]); $count2=3; $count=99; }  
                      }  
                     }  
                      
                     my $ref_tel=ref($telnet);  
                     if ($ref_tel ne "Expect") { return 0; }  
                     else  
                     {  
                      $user="user";  
                      $password="password";  
                      $telnet->raw_pty(1);  
                      $telnet->debug($debug);  
                      $telnet->log_file($logfile);  
                      $telnet->log_user(1);  
                      $telnet->log_stdout($screen_log);  
                      
                      print $telnet "ssh ".$user."@".$host."\n";  
                     }  
                      
                     my $good1 = 'Are you sure you want to continue connecting (yes\/no)?';  
                     my $good2 = 'Password:';  
                     my $good = $good1."|".$good2;  
                     my $bad  = 'Unable to connect|connection refused|ad passwords|onnection closed|Unknown host|onnection timed|not known';  
                     my ($match_num,$error,$match,$before,$after) = $telnet->expect(10,'-re',$good,'-re',$bad);  
                      
                     if    ($match=~/$bad/i)  { $telnet->hard_close(); }  
                     elsif ($match=~/$good1/i)  
                     {  
                      print $telnet "yes\r";  
                      ($match_num,$error,$match,$before,$after) = $telnet->expect(10,'-re',$good2,'-re',$bad);  
                     }  
                      
                     if ($match=~/$good2/i)  
                     {  
                      print $telnet $password."\r\n";  
                      $bad.="|Password:";  
                      $good="\@nipc1:~>";  
                      ($match_num,$error,$match,$before,$after) = $telnet->expect(10,'-re',$good,'-re',$bad);  
                      
                      if    ($match=~/$bad/i)  { $telnet->hard_close(); }  
                      elsif ($match=~/$good/i)  
                      {  
                       $telnet->log_user(1);  
                       flock(LOCKDATEI,LOCK_UN);  
                       close LOCKDATEI;  
                       return $telnet;  
                      }  
                     }  
                     else { $telnet->hard_close(); }  
                      
                     flock(LOCKDATEI,LOCK_UN);  
                     close LOCKDATEI;  
                     print "\n\nProblem: Einloggen auf nipc1 war nicht erfolgreich !!!\n\n";  
                     return 0;  
                    }  
                      
                      
                      
                    sub close_nipc1  
                    {  
                     my ($telnet,$user,$password,$ra_meldungen,$logfile,$screen_log,$debug)=@_;  
                     $telnet->raw_pty(1);  
                     $telnet->debug($debug);  
                     $telnet->log_file($logfile);  
                     $telnet->log_user(1);  
                     $telnet->log_stdout($screen_log);  
                      
                     $|=1;  
                     my $logfile = "/opt/vpn/logs/nipc1_log_$user";  
                     my $ref_tel = ref($telnet);  
                     if ($ref_tel eq "Expect")  
                     {  
                      print $telnet "exit\r";  
                      my $good = "closed";  
                      my $bad  = 'not found|unknown';  
                      my ($match_num,$error,$match,$before,$after) = $telnet->expect(20,'-re',$good,'-re',$bad);  
                      
                      if ($match=~/$bad/i)  
                      {  
                       print $telnet "quit\r";  
                       $good = "closed";  
                       $bad  = 'not found|unknown';  
                       ($match_num,$error,$match,$before,$after) = $telnet->expect(20,'-re',$good,'-re',$bad);  
                      }  
                      
                      $telnet->log_file($FEX::pre_logfile);  
                      &close_unix_level1($telnet,$FEX::pre_host,$user,$password,$ra_meldungen,$logfile,$screen_log,$debug);  
                      
                      $telnet->soft_close();  
                      $telnet->hard_close();  
                     }  
                     return 1;  
                    }  
                    
                    
                  3. coca_overlay.php:
                    -----------------

                      
                    <?  
                    $file=$argv[1];  
                    #echo "FILE=".$file."\n";  
                      
                    $arg_array=split("[?&]",$file);  
                    $file_arg=1;  
                    foreach ($arg_array as $arg)  
                    {  
                            if ($file_arg) { $file_arg=0; $file=$arg; continue; }  
                            $arg_subarray=split("=",$arg);  
                            $var=$arg_subarray[0];  
                            $value=$arg_subarray[1];  
                            #print "\nVAR=".$var."-VALUE=".$value."\n";  
                            $$var=$value;  
                    }  
                      
                    include ($file);  
                    ?>  
                    
                    
                  4. Ich hab jetzt noch was spannendes herausgefunden.... ich hab mal die Orginaldatei und die Datei, die das Expect-Script anlegt in Notepad++ geöffnet und verglichen (incl. aller Sonderzeichen).
                    Zu 99,9% sind die Dateien identisch, allerdings hab ich vier Stellen gefunden, an denen in der Orginaldatei ein Leerzeichen gefolgt von dem Code "BS" steht, die nicht in die Zieldatei übernommen wurden.

                    lt. Google handelt es sich aber um ein Backspace-Zeichen:
                    0001000 08 8 ^H BS Backspace

                    Also werden Leerzeichen gefolgt von Backspace nicht übernommen... und da kommt mir doch etwas von gesten hoch (nein, nicht das Gulasch..):

                    Aus der Expect.pm-Doku:
                    raw_pty(1_|_0)"$object->raw_pty(1 | 0)
                    Set pty to raw mode before spawning. This disables echoing, CR->LF translation and an ugly hack for broken Solaris TTYs (which send <space><backspace> to slow things down) and thus gives a more pipe-like behaviour (which is important if you want to transfer binary content). Note that this must be set before spawning the program.

                    Nachtigal, ich hör dir Trapsen!!!
                    raw_pty hab ich ja gesetzt, aber wird das evtl. nicht richtig umgesetzt?

                    Wenn ich jetzt in der Expect.pm nachsehe finde ich ab Zeile 859 folgendes:

                    # ugly hack for broken solaris ttys that spew <blank><backspace>
                      # into our pretty output
                    $buffer =~ s/ \cH//g;

                    OK, dann machen wir mal folgendes draus:

                    # ugly hack for broken solaris ttys that spew <blank><backspace>
                      # into our pretty output
                    #Disabled for binary file transfer
                    #$buffer =~ s/ \cH//g;

                    unnnnnnnnnnnnnnnnnddddddddddddd:

                    TAAAAAAAATAAAAAAAAAAAAAAAAAAAAAAA!!!! geht :D

                    Ich will jetzt zwar nicht wissen, was passiert, wenn ich mal mit einem "broken Solaris TTY" kommunizieren muss, aber mein Ziel hab ich erreicht :/

                    Trotzdem Danke für den Beistand!