#!/usr/local/bin/perl # # execute a command on a cisco router # # -d debug # -l prompt me for login # -c configfile # -w write config when done # # usage rcisco [-el] router command # # maf@net.ohio-state.edu - Nov 1998 # $Id: $ require "getopts.pl"; require "flush.pl"; use Net::Telnet (); &Getopts('wdlc:'); $PROMPT=">"; $TERMLEN1="set len 0"; # 5XXX $TERMLEN3="term"; # 19XX Enterprise (broken) $NEWVER="Overwrite the previous NVRAM configuration\?\[confirm\]"; $ROUTER = $ARGV[0]; $ARGLEN = $#ARGV; $fqdn = $ROUTER; $TYPE='IOS'; $EXIT = chr(26); die "usage: rcisco [-eldc conf] router command $ARGLEN\n" if ($ARGLEN < 0); if ($opt_c eq '') { if (! -e "$ENV{'HOME'}/.cpass") { if (-r "/var/cisco/.cpass2") { $PASS = "/var/cisco/.cpass2"; } elsif (-r "/var/cisco/.cpass") { $PASS = "/var/cisco/.cpass"; } } else { $PASS = "$ENV{'HOME'}/.cpass"; } } else { $PASS = $opt_c; } # read the cleartext passwords if (!$opt_l && ($PASS ne '')) { @r1 = split (/\./, $ROUTER); open (PASS, "<$PASS") or die "open($PASS): $!\n"; while () { chomp; next if /^\s*#/; ($router, $user, $login, $enable) = split; # try a partial match @r2 = split (/\./, $router); $match = 1; $x = 0; foreach $r (@r1) { next if ($r eq $r2[$x++]); $match = 0; last; } if ($match) { $fqdn = $router; $knowpass = $knowenable = 1; last; } # if } # PASS close PASS; } # opt_l $knowpass = 0 if ($login eq '-'); $knowenable = 0 if ($enable eq '-'); # # init # if ($opt_d) { $t = new Net::Telnet(Input_log => "input.log.$ROUTER", Output_log => "output.log.$ROUTER", Timeout => 90, Output_record_separator => ""); } else { $t = new Net::Telnet(Timeout => 90, Output_record_separator => ""); } # # open connection to router # $t->open("$fqdn"); # # login # ($pm, $m) = $t->waitfor("/Password:|Username:|Selection:/i"); if ($m =~ /username/i) { if (!$knowpass) { print STDERR "Username for $ROUTER: "; &flush(STDOUT); chomp ($user = ); } $t->print ("$user\n"); ($pm, $m) = $t->waitfor("/Password:/i"); } if ($m =~ /Password/i) { if (!$knowpass) { system ("/bin/stty -echo"); print STDERR "Password for $ROUTER: "; &flush(STDOUT); chomp ($login = ); print STDERR "\n"; system ("/bin/stty echo"); } $t->print ("$login\n"); } # 1900 if ($m =~ /Selection:/) { $t->print ("K"); $m='1900'; } # guess what type of box it is if ($m eq 'Password:') { $s = $TERMLEN2; # ios $TYPE='IOS'; } elsif ($m eq '1900') { $s = $TERMLEN3; $TYPE='1900'; } # set term length to 0 ($m, $pm) = $t->waitfor("/$PROMPT/"); $t->print ("$s\n"); # grab full prompt @lines = split(/\n/, $m); $PL = "\Q$lines[$#lines]\E"; $PR = $pm; $PROMPT="$PL$PR"; # enable $t->waitfor("/$PROMPT/"); $t->print ("enable\n"); if (!$knowenable) { system ("/bin/stty -echo"); print STDERR "Enable for $ROUTER: "; &flush(STDOUT); chomp ($enable = ); print STDERR "\n"; system ("/bin/stty echo"); } $t->waitfor("/Password/i"); $t->print ("$enable\n"); $PROMPT ="$PL#"; # config from terminal ($pm, $m) = $t->waitfor("/$PROMPT/"); $t->print ("config terminal\n"); #$PROMPT =~ s/#$/\\(config.*?\\)#/; $PROMPT = "$PL\\(config.*?\\)#"; # execute the commands while () { chomp; ($pm, $m) = $t->waitfor("/$PROMPT/"); $t->print ("$_\n"); print "$pm$m"; } # exit out of config mode ($pm, $m) = $t->waitfor("/$PROMPT/"); $t->print ($EXIT); print "$pm$m"; $PROMPT = "$PL#"; # write? if ($opt_w) { ($pm, $m) = $t->waitfor("/$PROMPT/"); $t->print ("wr\n"); print "$pm$m"; } # logout ($pm, $m) = $t->waitfor("/$PROMPT|$NEWVER/"); if ($m =~ /$PROMPT/) { $t->print ("exit\n"); print "$pm$m"; } elsif ($m =~ /$NEWVER/) { $t->print ("y\n"); ($pm, $m) = $t->waitfor("/$PROMPT/"); $t->print ("exit\n"); print "$pm$m"; }