PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [perl] per ssh [confirm] an Cisco senden



bezibaerchen
20-12-2004, 10:56
Hallo,

ich bastle an einem Script, um einen Cisco Accesspoint zu reloaden.

Er ist nur ueber SSH erreichbar, nicht ueber telnet.

Mein Script schaut folgendermaßen aus:



#!/usr/bin/perl
use Net::SSH::Perl;

my $ssh = Net::SSH::Perl->new("hostname");
$ssh->login("user", "pass");
$ssh->cmd("reload\nconfirm\n");


Das Problem habe ich mit



$ssh->cmd("reload\nconfirm\n");


Sage ich der Cisco "reload", erwartet sie noch 1x Enter zur Bestaetigung ( [confirm] ).

Deshalb hab ich die \n dazugemacht, das hilft aber nichts.

Ich bin nicht wirklich in perl bewandert. Habe bei meiner Suche was von wg expect gefunden, aber wirklich benutzen kann ich das nicht :-(

Dadurch, dass die Cisco auf das [confirm] (aka Druecken der Enter-Taste) wartet, laeuft das Script nicht durch.

Bitte helft mir.

LG,

Benni

Joghurt
20-12-2004, 16:13
Hast du schon confirm\n\n versucht?
Vielleicht musst du auch noch einen Carriage-Return senden:
confirm\r\n

Oder der Eingabepuffer wird geleert, bevor auf Enter gewartet wird, in dem Falle versuch einfach, noch einen $ssh->send("\n"); ans Ende des Skriptes zu packen.

bezibaerchen
21-12-2004, 07:26
Hilft leider alles nix :confused:

maceis
22-12-2004, 17:46
Wie sieht denn das konkrete Ergebnis aus, wenn Du das Skript startest (Fehlermeldung o. ä.)?
Hast Du mal getestet, ob es funktioniert, wenn Du ein Kommando "sendest" das keine Bestätigung verlangt (z. B. "sh clock" oder sowas)?

Was für einen Cisco hast Du denn im Einsatz und welches IOS?

bezibaerchen
22-12-2004, 18:43
Das "Ergebnis" besteht darin, dass das Script haengt. Keine Fehlermeldung oder so.

Cisco ist ein Aeronet Accesspoint.

Das mit dem Kommando, wo er kein confirm will, versuche ich morgen, wenn ich wieder im Buero bin.

maceis
23-12-2004, 00:23
Ich hab mich noch ein wenig damit beschäftigt und arbeite an einer Lösung, weil ich was ähnliches benötige.
Mit einem normalen "show clock" o. ä. klappts bei mir (C1603R) schon problemlos.

Das mit dem "reload" wird so einfach nicht hinhauen, da Du für einen reload im enable-Modus sein musst (oder ist das bei einem AP anders ?).
Um da rein zu kommen benötigst Du eine interaktive Shell oder einen Kommunikationskanal.

Ich hab da schon rumgebastelt.
Mein Problem ist aber noch, dass der Passwortabfrageprompt von "enable" anscheinend nicht nach STDOUT geschrieben wird.
Daher kann ich den im Skript nicht abfragen.

Morgen fahr ich erstmal für ein paar Tage weg (ohne Router ;)), aber im neuen Jahr möcht´ ich die Nuss eigentlich schon knacken.

bezibaerchen
23-12-2004, 08:28
Also, wenn ich ein
sh ver als cmd mache, returned das Script normal, also ich lande wieder auf der shell.

Also liegt es wohl definitiv an dem fehlenden confirm


edit:
ena brauche ich auf dem Accesspoint nicht.

maceis
23-12-2004, 10:34
...
Also liegt es wohl definitiv an dem fehlenden confirm
...okay, dann kann ich Dir evtl. im kommenden Jahr eine Lösung anbieten.
Voraussetzung für meinen derzeitigen Ansatz wäre, dass die [confirm]-Abfrage nach STDOUT geschrieben wird.
Kannst Du mir gelegentlich den ganauen [confirm]-Prompt posten ?

Bin schon gespannt, ob es dann klappt.

bezibaerchen
23-12-2004, 10:40
okay, dann kann ich Dir evtl. im kommenden Jahr eine Lösung anbieten.
Voraussetzung für meinen derzeitigen Ansatz wäre, dass die [confirm]-Abfrage nach STDOUT geschrieben wird.
Kannst Du mir gelegentlich den ganauen [confirm]-Prompt posten ?

Bin schon gespannt, ob es dann klappt.



bez@earth:/staff/bez > ssh -o "Protocol 1" admin@ap1-wor
admin@ap1-wor's password:

ap1-wor#reload
Proceed with reload? [confirm]


An dieser Stelle will die Kiste ein "Enter".

Joghurt
23-12-2004, 12:03
Wie wäre es damit?
$ssh->cmd("reload");
sleep 5;
$ssh->cmd("confirm");

maceis
05-01-2005, 12:15
hallo, da bin ich wieder.

um es gleich vorweg zu nehemen: Der Lösungsansatz, den ich verfolgt hatte, hat sich bisher nicht realisieren lassen.
Beim Stöbern im Netz habe ich das Beispiel remoteinteract.pl (http://search.cpan.org/src/DROLSKY/Net-SSH-Perl-1.25/eg/remoteinteract.pl) des Autors von Net::SSH::Perl gefunden, das leider auch nicht funktioniert.
Vielleicht hilft es Dir trotzdem weiter, man muss es aber auf jeden Fall ergänzen und anpassen.
Bei mir hat jedenfalls selbst das Beispielkommando "passwd" nicht funktioniert.

Der Lösungsvorschlag von Joghurt kann leider auch nicht funktionieren, da $ssh->cmd($command) für jedes Kommando eine neue Verbindung aufmacht.