Telnet Script Issues

HI All
Some body wrote to me this Telnet Script :

#!/opt/perl/bin/perl
$ip       = $ARGV[0];
die ("IP must be passed as an argument. $!\n") unless defined($ip);
use Net::Telnet ();
$handle = new Net::Telnet (Timeout => 10, Prompt => '/.*(#|>|\))\s*$/');
$handle->open("$ip");
$handle->login("MY_USER","PASSOWRD");
$handle->cmd("terminal length 0");
@lines = $handle->cmd("show cdp neighbor");
print "@lines";
#system("sleep 30");
$handle->cmd(exit);
$handle->close;

This Script telnets a Cisco device and execute a command and prints out the result.
My Issues in this Script are :
1 - I understand all the lines Except this one � Prompt => '/.*(#|>|\))\s*$/' �
I know its function is define the Prompt for cisco router but I need any one explain it for me I mean the syntax .

2 - I downloaded the telnet module from CPAN.org and tried to install it, it gives me an error like this :

CORE" perlmain.c
(Bundled) cc: warning 480: The -A option is available only with the C/ANSI C pro
duct; ignored.
(Bundled) cc: warning 480: The +Z option is available only with the C/ANSI C pro
duct; ignored.
(Bundled) cc: warning 422: Unknown option "f" ignored.
(Bundled) cc: warning 480: The +Onolimit option is available only with the C/ANS
I C product; ignored.
(Bundled) cc: warning 480: The +Opromote_indirect_calls option is available only
 with the C/ANSI C product; ignored.
cpp: "/opt/perl_32/lib/5.8.8/PA-RISC1.1-thread-multi/CORE/perlio.h", line 121: e
rror 4065: Recursion in macro "PerlIO".
*** Error exit code 1

Stop.
*** Error exit code 1

And when I try to execute the script it gives me this error :

Can't locate Net/Telnet.pm in @INC (@INC contains: /opt/perl_32/lib/5.8.8/PA-RIS
C1.1-thread-multi /opt/perl_32/lib/5.8.8 /opt/perl_32/lib/site_perl/5.8.8/PA-RIS
C1.1-thread-multi /opt/perl_32/lib/site_perl/5.8.8 /opt/perl_32/lib/site_perl /o
pt/perl_32/lib/vendor_perl/5.8.8/PA-RISC1.1-thread-multi /opt/perl_32/lib/vendor
_perl/5.8.8 /opt/perl_32/lib/vendor_perl .) at ./t1 line 4.
BEGIN failed--compilation aborted at ./t1 line 4.

Last thing may helps you to resolve my issue is I have this version of perl :

This is perl, v5.8.8 built for PA-RISC1.1-thread-multi

Thanks a lot for your help :frowning:

The prompt regular expression means any character (.) zero or more times () followed by either # or > or ), followed by whitespace (\s), zero or more occurrences (), followed by end of line ($). Read up on regular expressions; it's time well invested.

Installing the module obviously failed. Looks like you need to find a C compiler which is a "C/ANSI C product" for your platform. It might be as simple as rearranging your PATH to make /opt/path/to/secret/ansi/cc come before /usr/bin/sucky/old/legacy/we/hate/our/customers/cc but really, google for a bit and read the documentation for your platform's compiler alternatives.

... or see if you can find GCC for your platform.

Quick googling turned up similar problems in other Perl modules; Mysql-DBD Perl module Installation Problem in HPUX looks vaguely helpful for solving the problem, and Expat XML Parser / Bugs / #327 Recursion in macro "parsing", HP 11.0 suggests that this is a bug in the C compiler for HP-UX.

As such, the configure script ought to know about these issues, and not produce an incorrect Makefile for your platform. Maybe you could submit a bug report about this, although I can't tell exactly whose bug that is.

Thanks a lot for your help Era

I am using HP UX, but I have another hardware with same specs and working fine.
Anyhow I will try to Google it ,
But please If there is any body has quick solution, HELP ME :slight_smile:

I have an issue with one device, that doesn't return prompt like # at the end of output. It simply give a new line. But output can containt a few lines. Which kind of "prompt" can I put here to Net::Telnet??

I need to telnet to a sun servervia 9023 port.
Normally, I can telnet directly as below:
telnet 10.2.4.9 9023
Trying 10.2.4.9...
Connected to 10.2.4.9.
Escape character is '^]'.
900 Login required.
login username passwd
login username passwd
102 2 records.
Lucent NavisRadius Radius Server, Version 4.5.8 (Build 551-060)
Copyright (c) 1998-2005 Lucent Technologies Inc. All Rights Reserved.
==>

I tried to use Net::Telnet with the code following:

#!/usr/bin/perl -w
use Net::Telnet ();
$t = new Net::Telnet (Timeout => 10,Port => 9023,Prompt => '/==> $/');
$t->open("10.2.4.9");
$t->waitfor("900 Login required. $/i");
$t->print("login username passwd");

But it's not successful. This is the error message:

missing opening delimiter of match operator in argument "900 Login required.i" given to Net::Telnet::waitfor() at ./try line 5

How can i fix it ?

It doesn't like the slash because it's (stupidly, buggily) using that internally as a regex separator, apparently. Try backslash-escaping it. Or, if it's meant as a regex separator, put in the missing opening separator.

I tried use the backslash character. But the result is same.
I think my problem that beacause I telnet via 9023 port, so username and password is entered in the same row
"login username passwd"
May be Net::Telnet don't support this. Is it right ?

Try putting a slash as the first character, or take out the "$/i" part.

Net::Telnet doesn't really care how the password is sent, you just need to write a script for it which is correct for your situation.

you can use
use Telnet ();
instead of #use Net::Telnet;

it will work without requeting you to install module

I made this small script and it works fine

$telnet = new Telnet ( Timeout=>10, Errmode=>'die'); # Perl Telnet module running new instance
$telnet->open("$IP");
$telnet->waitfor('/password/i'); # According to NE behaviour it displayed password

print "Trying to login to user mode \n";
$telnet->print("$user_password"); # Typing user password
$telnet->waitfor('/\> /i'); # ">": Prompt for user mode
print "successfully login to user mode \n";

$telnet->print('show version');
@version = $telnet->waitfor('/\> /i');
@fileds= split (/\s/,$version[0]);

$telnet->print('enable');
$telnet->waitfor('/password/i');
print "Connecting to enable mode \n";
$telnet->print("$enable_password");
$telnet->waitfor('/\# /i'); # "#": Prompt for enable mode

Please notify me if I can help

Dark Knight.

For what's worth.. Telnet sends login and password in clear text. I've not used or suggested using telnet for some time. Instead I'd opt for ssh, you can define a trust that allows connections without passing the password.

This web site has a good tutorial on how to define it.
http://www.cvrti.utah.edu/~dustman/no-more-pw-ssh/

With SSH you can SCP (Secure copy from system to system) or remotely execute commands

such as scripts on the target system:
sudo -u remoteuser ssh remoteuser@host.domain.tld '/usr/local/bin/shellscript.sh'

Much more robust and best is it is secure.