请问在telnet模块中,怎样精确设置Prompt参数,来消除多余的输出?

请问在telnet模块中,怎样精确设置Prompt参数,来消除多余的输出?

我的想法是,先使用默认值登录一次,取得远程主机的PS1变量值(这个变量值就是提示符的内容),存到一个$my_prompt变量,然后再重新设置telnet,使用$my_prompt的值作为Prompt的参数,但是运行时它老是说:
ignoring bad Prompt argument "#": missing opening delimiter of match operator at ./telnet.pl line 74
在另一台测试机上提示:
ignoring bad Prompt argument "root@teamsun02 #": missing opening delimiter of match operator at ./telnet.pl line 74

以下是脚本内容:
$telnet = new Net::Telnet (Timeout => 10);
$telnet -> open ($my_remote) ;
$telnet -> login($my_user, $my_password);
#PS1变量就是提示符的内容,因此,取得PS1变量,作为$my_prompt的值
#my @my_prompt = $telnet -> cmd("env | grep \"PS1\" ");
my @my_prompt = $telnet -> cmd("echo \$PS1 ");
my $my_prompt = shift(@my_prompt);
chomp $my_prompt;
print "\$my_prompt is $my_prompt \n";
#以下开始以$my_prompt的值作为Prompt参数的值,进行telnet
$telnet = new Net::Telnet (Timeout => 10,
                                             #Prompt => '/[\$%#>] $/' #默认值
                                              Prompt => $my_prompt
                                           );
$telnet -> open ($my_remote) ;
$telnet -> login($my_user, $my_password);

@my_result = $telnet -> cmd("who");
print "@my_result \n";

以下是运行时的输出:
bash-3.00# ./telnet.pl remote=3.3.3.10 user=root password=root
$my_remote is 3.3.3.10
$my_user is root
$my_password is root
$my_prompt is #
ignoring bad Prompt argument "#": missing opening delimiter of match operator at ./telnet.pl line 74
root       pts/2        Oct  8 09:06    (jjqing)
root       pts/4        Oct  8 10:00    (solaris01)
bash-3.00#

这个结果是对的,因为我的PS1值是默认值:
bash-3.00# echo $PS1
\s-\v\$

但是在另外一台设置了PS1参数的机器上运行的结果是:
bash-3.00# ./telnet.pl remote=192.168.8.102 user=root password=root
$my_remote is 192.168.8.102
$my_user is root
$my_password is root
$my_prompt is root@teamsun02 #
root       pts/1        Oct  8 09:39    (teamsun01-vip)
root       pts/2        Oct  8 09:44    (teamsun01-vip)
root       pts/5        Oct  8 10:14    (192.168.8.6)
root       pts/4        Oct  7 10:12    (teamsun02)
root@teamsun02  

以上红色字体root@teamsun02,是perl过滤掉默认值"#"后,把root@teamsun02也当成是命令输出的结果返回过来了,因此,要消除掉这种多余的内容。

请大家帮忙看看,谢谢!

我使用以下方法,来过滤掉多余的输出:

先取得提示符的内容,去掉最后的“#”号:
        sub get_telnet_prompt {
                #my $telnet = Net::Telnet->new(Host => $my_remote,Timeout => 20) or die "Can't connect.$!\n";
                $telnet = new Net::Telnet (Timeout => 10);
                $telnet -> open ($my_remote) ;
                $telnet -> login ($my_user, $my_password);
                #PS1变量就是提示符的内容,因此,取得PS1变量,作为$my_prompt的值
                @my_prompt = $telnet -> cmd("echo \$PS1 ");
                $my_prompt = shift(@my_prompt);
                chomp $my_prompt;
                $my_prompt =~ s/#.*//;
                $my_prompt =~ s/\s+$//;
                print "\$my_prompt is $my_prompt \n";
        }


用cmd方法取得远程主机的输出,然后过滤:
                @my_result = $telnet -> cmd("/bin/ksh -c \"export LANG=$my_lang;who\" ");
                foreach (@my_result) {
                        if ($_ =~ m,^\s*$my_prompt,) {
                                $_ = "";
                        }
                }


用这种变通的方法,勉强可以使用,就是不知道如果远程主机设置了某种奇怪的prompt时,我的脚本还能不能运行。