Leser: 27
QuoteThe methods login() and cmd() use the prompt setting in the object to determine when a login or remote command is complete. Those methods will fail with a time-out if you don't set the prompt correctly.
QuoteWenn ich das wüsste, wäre mein Problem bestimmt schon fast gelöst.woher weiß denn dein Switch wie groß dein Terminal ist?
QuoteJa, mit Net::Telnet bekomme ich auch diese Meldung: "Press <SPACE> to continue or <Q> to quit:"Hast du überprüft, ob Net::Telnet dieselbe Meldung erhält wie du?
QuoteNein, ich habe auch mal getestet ein <SPACE> zu senden, wenn die Meldung "Press <SPACE> to continue or <Q> to quit:" kommt, dann gibt es mir die nächsten Zeilen aus, und wartet wieder mit dieser Meldung auf.Vielleicht bekommst du auch einfach einen Timeout, weil der 'Prompt' nicht richtig gesetzt ist:
QuoteDas mit der NAOP habe ich auch schon im Quelltext als Definition gesehen, ohne jede Funktion. Mal sehen, was sich darausfinden lässt, z.B. mit Net::Telnet::Options.Anscheined gibt es eine Telnet-Option, die es erlaubt festzulegen, wie groß eine "Seite" ist: Negotiate Output Page Size (NAOP).
QuoteIch wollte halt kein "Gefrickel" daraus machen. Mal sehen, wenn es mit dem NAOP nicht klappt, wird mir wohl nichts anderes übrig bleiben...Spricht denn irgendwas dagegen hin und wieder ein <SPACE> zu senden?
2009-08-31T14:50:32 xiconfjs[...]
QuoteIch wollte halt kein "Gefrickel" daraus machen. Mal sehen, wenn es mit dem NAOP nicht klappt, wird mir wohl nichts anderes übrig bleiben...Spricht denn irgendwas dagegen hin und wieder ein <SPACE> zu senden?
[...]
QuoteEigentlich schon, aber in meinem Fall weiss ich ziemlich sicher, wie viele Zeilen es maximal Werten könnten.Steht nicht zu befürchten, dass es erst recht unsauber ist, irgendeine Größe für das virtuelle Terminal zu wählen und zu hoffen, dass wirklich die gesamte Ausgabe hineinpasst?
Quoteschau mal ob du im Terminal die Variable "$LINES" hast, einige Programme schauen in der nach, wie viele Zeilen sie ausgeben können.
QuoteErgänzung:
Und $COLUMNS wird verwendet, um die Breite mitzuteilen... (falls die Länge pro Zeile interessant wird)
echo $LINES
QuoteVielleicht stehe ich ja auf dem Schlauch, aber mein Quelltext sieht so aus:
Wie startest du Programme über Net::Telnet?
Code:
echo $LINES
starten und sehen was zurück kommt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#!/usr/bin/perl use strict; use warnings; use Net::Telnet; $|=1; my $t = new Net::Telnet (Timeout => 10, Telnetmode => 0); my $username = "user"; my $password = "pass"; $t->open("192.168.10.199"); #ip des switches $t->waitfor('/login:.*$/') or die "no login prompt: ", $t->lastline(); $t->print($username); $t->waitfor('/password:.*$/') or die "no password prompt: ", $t->lastline(); $t->print($password); $t->waitfor('/save your configuration/') or die "login not successful: ", $t->lastline(); $t->print("show ports configuration no-refresh"); #befehl der den Status der Ports ausgibt my $stay_while = 1; while($stay_while) { my $line = $t->getline(); chomp($line); print $line."\n"; if($line =~/indicates/) #wenn das zugrifft, dann ist die Ausgabe beendet. { $stay_while = 0; } }
QuoteJo wahrscheinlich.Ich vermute mal das "wer" überlesen hat das du von einem "eXtreme-Switche" sprachst.
QuoteIch habe diese Befehle schon probiert, aber sie sind leider nicht im Befehlsrepertoire vorhanden.Nicht selten läuft auf solchen Systemen eine eine Shell, oder eine DOS-Artige Umgebung. Es kann durchaus sein, dass Befehle wie "echo" "set" oder "export" funktionieren.
QuoteUnsere Switche sind nicht mehr einer Firmware ausgestattet, die SSH beinhaltet, und im Moment ist auch nicht vorgesehen, die Firmware zu aktualisieren bzw. zu erweitern.Beim überfliegen des Handbuchs ist mir aufgefallen, dass der Switch scheinbar ssh kann. Ich denke es könnte einfacher sein mittels Net::OpenSSH oder Net::SSH zum Ziel zu kommen, da ich mich glaube, dass hier mehr Einstellungsmöglichkeiten vorhanden sind.
QuoteDu hast Recht, es gibt den Command wirklich, wobei dieser nur pro Session gesetzt werden kann...aber immerhin ein Weg, wenn auch keine Lösung des Problems.Ich glaube mich dunkel dran erinnern zu können, dass man das Verhalten, das du hast, z.B. bei Ciscos abschalten kann. Gibts da nicht eventuell ein Kommando? Hab leider von eXtreme-Switches nicht wirklich Ahnung.
disable clipaging
QuoteHabe es mal kurz in meinem Terminal getestet, sieht ganz interessant aus, obwohl es bei meinen ersten Test sehr träge lief, Ausgabe von 50 Zeilen brauchte knapp 3 Sekunden.nach etwas suchen bin ich auf das Gestoßen:
http://cpansearch.perl.org/src/AJWOOD/Term-VT102-0...
1
2
3
Client --------> WILL NAWS -------> Server
Client <--------- DO NAWS <-------- Server
Client -> SB NAWS $width $heigth -> Server
Quotejo, anstatt NAWS ist wahrscheinlich NAOP angebrachter. Will heißen: Ich habe es mir zwar schon mal angeguckt, verstehe das Modul aber eher so, dass es für Telnet-Server gedacht ist, also wenn man selber einen Telnet-Server "hosten" möchte, oder sehe ich das falsch?!?Wie es aussieht wirst du es über Net::Telnet::Options realisieren können.
Ein Beispiel für die Abfrage (NAWS) ist vorhanden, aber wie man aktiv die Auflösung setzt weiß ich noch nicht...
1 2 3 4 5
my ($width,$height)=(80,200); my $nto = Net::Telnet::Options->new(); $nto->activeWillOption('NAWS', {'DO' => sub{$nto->sendOpt($socket, 'SB', 'NAWS', '', pack('n*', $width, $height));} } ); $nto->doActiveOptions($socket);
Quote2. Client suggests and server agrees to used NAWS.
(client sends) IAC WILL NAWS
(server sends) IAC DO NAWS
(client sends) IAC SB NAWS 1 44 0 24 IAC SE
[A window 300 characters wide, 24 characters high]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
#!/usr/bin/perl use strict; use warnings; use Net::Telnet; use Net::Telnet::Options; my $username = "topeg"; my $password = "xxxxx"; my ($width, $height)=(80,100); my %options = ( TTYPE => { 'DO' => \&set_term_type } ); my $nto = Net::Telnet::Options->new(%options); $nto->activeWillOption('NAWS', {'DO' => \&set_term_size } ); my $t = new Net::Telnet (Timeout => 10, Telnetmode => 1,Prompt => '/\$\s*$/' ); # teminal auf VT100 setzen wenn danach gefragt wird. sub set_term_type { $nto->sendOpt($t, 'SB', 'TTYPE', 'IS', 'VT100'); return; } # Terminalgröße Setzen sub set_term_size { $nto->sendOpt($t, 'SB', 'NAWS', '', pack('n*', $width, $height)); return; } my $data; $t->telnetmode(0); $t->open("192.168.1.222"); # Teminal setzen # muss ich auf meinem Rechner machen, # da "top" sonst mosert. # in.telnetd fragt am anfang gleich nach, was für ein terminal wir haben. # ansonsten könnte ich das telnetmode(0) nach dem open setzen, # denn dann schluckt Net::Telnet die mögliche Frage. recv($t, $data, 1024, 0); $nto->answerTelnetOpts($t, $data); # aktiv größe des Terminal setzen $nto->doActiveOptions($t); # auf Antwort warten. recv($t, $data, 1024, 0); # und auswerten. $nto->answerTelnetOpts($t, $data); # Net::Telnet soll wieder übernehmen $t->telnetmode(1); $t->login($username,$password); # Top ausführen, # das Programm wertet die Terminalgröße aus my @lines = $t->cmd(String => 'top -n 1', Prompt => '/\n\s*\Q$username@\E/'); chomp(@lines); print "ZEILEN:".@lines."\n";
2009-09-02T09:26:32 xiconfjsQuoteDem kann ich nur zustimmen.Der Code ist recht hässlich, aber funktioniert. Ich muss mal schauen ob es eleganter geht...
Quotehi ich muss ein nagios plugin schreiben eben falls...