【问题标题】:Can not send data to IO::Socket::INET in conditional statement无法在条件语句中向 IO::Socket::INET 发送数据
【发布时间】:2013-07-24 20:48:31
【问题描述】:

我在通过 IO::Socket::Inet 与外部系统通信时遇到问题。 我尝试登录并向系统发送多个命令,但不幸的是,如果第 58 行中的命令打印在条件语句下,这将不起作用。 在这种情况下,需要条件语句来处理响应数据。

package Net::Cli::Cisco;

use 5.006;
use strict;
use warnings FATAL => qw(all);

use IO::Socket::INET;
use Carp;

use Data::Dumper;
$| = 1;

sub new {
    my $class = shift;
    my %args  = @_;
    my $self  = bless {
        _host     => $args{host}     || carp('No hostname defined'),
        _username => $args{username} || carp('No username defined'),
        _password => $args{password} || carp('No password defined'),
        _logged_in => 0,
    }, $class;
    return $self;
}

sub connect {
    my $self = shift;
    my $host = $self->{_host};
    my $port = 23;

    my $handle = IO::Socket::INET->new(
        Proto    => "tcp",
        PeerAddr => $host,
        PeerPort => $port,
        Type     => SOCK_STREAM,
        Timeout  => 3
    ) or die "can't connect to port $port on $host: $!";

    my $shc = "\r\n";
    $self->{shc}    = $shc;
    $self->{handle} = $handle;
}

sub getInterface {
    my ($self) = @_;
    $self->connect;
    my @cmd_list = ( "sh clock", "sh ip int brief" );
    $self->send_cmd(@cmd_list);
}

sub send_cmd {
    my ( $self, @cmd_list ) = @_;
    my $handle = $self->{handle};
    my $response;
    while ( $response = <$handle> ) {

        if ( $response =~ m/^Username:/ ) {
            print "Conditional statements exec done!\n";
            print $handle $self->{_username} . $self->{shc};
        }

        #print $handle $self->{_username} . $self->{shc};
        print $response;
        print $handle $self->{_password} . $self->{shc};
        print $handle "enable" . $self->{shc};
        print $handle $self->{_password} . $self->{shc};
        print $handle "term leng 0" . $self->{shc};

        foreach my $cmd (@cmd_list) {
            print $handle "$cmd" . $self->{shc};
        }
        print $handle "exit" . $self->{shc};

    }

    close($handle);
}

1;

my $x = __PACKAGE__->new(
    "host"     => "1.1.1.1",
    "username" => "user",
    "password" => "pw"
);
$x->getInterface;

好吧,我不明白为什么我的代码是错误的。 注意:如果我推荐第 61 行,一切正常。 有什么想法吗?

【问题讨论】:

  • 有任何迹象表明$response =~ m/^Username:/ 会成为真的吗?
  • 是的,服务器响应包括“用户名:”。
  • 我问的不是这个。你得到Conditional statements exec done!的输出了吗?
  • 是的,输出“条件语句执行完成!”在那里!
  • 你如何确定 print $handle $self->{_username} 。 $self->{shc};在条件块之外工作,但不在它里面?

标签: perl


【解决方案1】:

经过 ikegami 的评论,请在下面找到工作子程序:

sub send_cmd {
my ( $self, @cmd_list ) = @_;
my $handle = $self->{handle};
my $response;
START: while ( $response = <$handle> ) {
        print $response;
        if ( $response =~ m/[^Username:|^Password:|\$%#:>]/ ) {
            print $handle $self->{_username} . $self->{shc};
            print $handle $self->{_password} . $self->{shc};
            print $handle "enable" . $self->{shc};
            print $handle $self->{_password} . $self->{shc};
            print $handle "term leng 0" . $self->{shc};
            foreach my $cmd (@cmd_list) {
              print $handle "$cmd" . $self->{shc};
            }

            print $handle "exit" . $self->{shc};
        } else {
            goto START;
        }
    }
close($handle);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    相关资源
    最近更新 更多