Expect/Bash Zeilenumbrüche beim Absetzen von Befehlen verhindern
Stefan Welscher
- perl
Hallo liebe Leute,
ich habe ein kleines Problem mit Perl/Expect.pm/bash, ich weiß allerdings nicht genau welches der drei Elemente mir gerade Probleme bereitet...
Folgendes Szenario:
Ich habe eine Expect-Session zu einem entfernten Server, auf den ich mich hop-by-hop aufwähle (ein Routing zwischen den Netzen gibt es nicht).
Auf dem Server möchte ich ein Programm mit bestimmten Parametern ausführen, was soweit auch funktioniert und die Rückgabe (im Idealfall nur eine "1") abfangen.
Problem:
Beim Aufruf des Programms wird ein langer base64-encoded String übergeben (max ca. 6KB), was scheinbar eine Art Zeilenschaltung auf der Shell oder in Expect verursacht. Der Screenlog sieht wie folgt aus:
user@Server:~> export PS1="" && echo "%EXPECT_FIN%"
%EXPECT_FIN%
stty raw -echo && echo "%EXPECT_FIN%"
%EXPECT_FIN%
%EXPECT_FIN%
Wie man sieht schaffe ich es, dass der eigentliche Befehl nicht mehr mit ausgegeben wird, aber der Output wird durch die vielen "> "-Zeichen gestört, die definitiv nicht vom Programm selbst kommen. Leider landet der Müll auch in meiner before-Variable und stört somit den Parser, der das Ergebnis interpretieren muss:
DEBUG:BEFORE=> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 1
Als menschlicher Nutzer konnte ich das Verhalten leider nicht nachstellen.
Natürlich hätte ich die Möglichkeit die "> "-Sequenz per Regex zu löschen, aber geht das nicht auch sauberer, dass sie gar nicht erzeugt wird?
Relevanter Perl-Code:
$telnet=new Expect;
$telnet->raw_pty(1);
$telnet->slave->stty(qw(raw -echo));
$telnet->spawn("/usr/bin/telnet ".&resolv($hostname)) or die "konnte Telnet nicht starten $!\n";
$telnet->debug($debug);
$telnet->log_file($logfile);
$telnet->log_user(1);
$telnet->log_stdout($screen_log);
my $good="%EXPECT_FIN%";
print $telnet "export PS1=\"\" && echo \"".$good."\"\r";
$telnet->expect(5,$good);
$telnet->clear_accum;
print $telnet "stty raw -echo && echo \"".$good."\"\r";
$telnet->expect(5,$good);
$telnet->clear_accum;
print $telnet "program.pl \"".$par1."\" \"".$par2."\" \"".$basic_ce_filename."\" \"".$basic_ce_content."\" \"".$archive_filename."\" \"".$archive_content."\" && stty echo && echo \"".$good."\"\r";
my ($match_num,$error,$match,$before,$after) = $telnet->expect(10,$good);
print "\nDEBUG:BEFORE=".$before."\n";