Perl 我从远程服务器更改密码的代码无效

Perl 我从远程服务器更改密码的代码无效,perl,Perl,我在perl脚本中使用了它,它登录到两台服务器,并试图通过远程主机更改服务器的密码。但问题是两台服务器上的密码都没有更改,而且我也没有找到一种方法来检查是否使用expect将新密码传递给服务器。我张贴的那部分代码,它是检查提示,并试图改变密码 #!/usr/bin/perl package Session; use strict; use warnings; use Expect; use IO::Pty; use Data::Dumper; use Time::HiRes qw(us

我在perl脚本中使用了它,它登录到两台服务器,并试图通过远程主机更改服务器的密码。但问题是两台服务器上的密码都没有更改,而且我也没有找到一种方法来检查是否使用expect将新密码传递给服务器。我张贴的那部分代码,它是检查提示,并试图改变密码

     #!/usr/bin/perl
package Session;
use strict;
use warnings;
use Expect;
use IO::Pty;
use Data::Dumper;
use Time::HiRes qw(usleep);
use Switch;
use YAML;
use feature 'say';

my $host1 = $ARGV[0];
my $host2 = $ARGV[1];
my $host1_adapter_name = $ARGV[2];
my $host2_adapter_name = $ARGV[3];

my $exp = Expect->new;
my ($selfObj) = @_;
my $str = "{$host1}\{root} # ";
my $cmdStr; my $result; my $dev_id; 
my $timeout = 10;
my $min = 192;
my $range = 32;


my $host1_dev_id = _adapter($host1_adapter_name);
my $host2_dev_id = _adapter($host2_adapter_name);
my @hosts = ("$host1", "$host2");
print ("host2 name is=$host2------");
foreach my $n (@hosts)
{
    print ("value of n is $n\n");
    if ( $n eq $host1 )
    {
        _login($n,$host1_dev_id);
    }
        if ( $n eq $host2)
        {
            print ("inside 2nd if-----\n");
                _login($n,$host2_dev_id);
        }

}  

sub _login
{
    my ($host,$host_dev_id) = @_;
    my $exit = 1;
    $exp->raw_pty(1);
    $exp = Expect->spawn("telnet $host") or die "unable to connect , Please check the connection & retry again: $!\n";

    if (!defined($exp))
    {
        print "Please check the connection & retry again\n";
            return -1;
    }

    `sleep 2 `;

    $exp->expect($timeout,
    [
        qr'[lL]ogin:[\s]?[a]?[s]?[\s]?$',
            sub
            {
            $exp->send("root\r");
            `sleep 3 `;
            exp_continue;
        }
        ],
        [
            qr'[pP]assword:[\s]?$',
            sub
            {
            $exp->send("That11NeverWork!\r");
            exp_continue;
            }
        ],

        [
            qr '[#>:][\s]?$',
            sub {

            $cmdStr = "passwd\r";
            $result =_run_cmd($cmdStr);

            qr'root\'s New password:\s*'; 
            $exp->send("raym0nd24");

            qr'Enter the new password again:\s*';
            $exp->send("raym0nd24");
           # $exp->send('passwd:\s*',5);

            $exit = 0;
                exp_continue;

    }
],
[
        eof =>
        sub
        {
            print("FileName : Session.pm , ERROR: premature EOF in command execution.\n");
        }
],
       '-re', qr'[#$>:]\s?$', # wait for shell prompt, then exit expect
);
}



#############################################################
#############################################################################
sub _adapter
{
        my ($adapter_name) = @_;
        print "Adapter name: $adapter_name\n";
        chomp($adapter_name);
        switch($adapter_name){
                case "AUSTIN"             {$dev_id="e414571614102004"}
                case "CX5"                {$dev_id="b315191014103506"}
                case "CX4"                {$dev_id="b31513101410f704"}
                case "CX4_EG10"           {$dev_id="b315151014101f06"}
                case "CX4_EG25"           {$dev_id="b315151014101e06"}
                case "CX3"                {$dev_id="RoCE"}
                case "CX2"                {$dev_id="b315506714106104"}
                case "CX3_PRO"              {$dev_id="RoCE"}
                case "CX3_PRO1"            {$dev_id="b31507101410e704"}
                case "HOUSTON_LR"         {$dev_id="df1020e214104004"}
                case "HOUSTON_SR"         {$dev_id="df1020e214100f04"}
                case "HOUSTON_Cu"         {$dev_id="df1020e214103d04"}
                case "SHINER_S"           {$dev_id="e4148a1614109304"}
                case "SHINER_T"           {$dev_id="e4148e1614109204"}
                case "SLATE_SR"           {$dev_id="df1020e21410e304"}
                case "SLATE_CU"           {$dev_id="df1020e21410e404"}
                case "EVERGLADES"         {$dev_id="b315151014101e06"}
                else              { print "Adapter not in list\n"}
        }
        return $dev_id;
}

#######################################################################################
##########################################################
sub _run_cmd
{
    my $output; my $output1;
    my ($cmdStr) = @_;
    $exp->send($cmdStr ."\r");
    $exp->expect(21, '-re', $str);
    $output = $exp->exp_before();
    $exp->clear_accum();
        my @PdAt_val = split("\r?\n", $output);
        foreach my $line1 (@PdAt_val)
        {
                chomp($line1);
                if ( $line1 =~ /(\(\d+\))(\s*root\s*\@\s*)/)
                {
                        if ( $1 =~ /\((\d+)\)/)
                        {
                                if ($1 != 0)
                                {
                                        print("*************** Command $cmdStr didn't ran sucessfully ***************\n");
                                        exit;
                                }
                        }
                }
       }

    return $output;
}



######################################################################

对于不同的系统有不同的解决方案。因此,从他们的上帝那里得到的一些系统必须有高层次的限制。因此,普通用户说,您不能直接以root用户身份登录。你可以使用sudo或su来提升舞台。我在你的台词里看不出你的心思

# The simpliest way is to use what you have!
sub passwd 
{  
   my $user = @_[0];
   my $password = @_[1];
   #
   # as root 
   my $execline = qq~passwd $user:$password~;
   #
   # as root with second password
   my $execline = qq~passwd $user:$password\n$password~;
   #
   # for microsoft certified ubuntu noobs, kidding mint's
   my $execline = qq~sudo $password && passwd $user:$password~;
   #
   # for apple greyed, debian nerds, solaris freaks 
   my $execline = qq~su $password && passwd $user:$password~;
   #
   my $return = system("$execline");
}

print &passwd("root","the magical word");
#
# elseif read this.url([to get the higher experience][1]);
[1]: https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script

qr
表达式未分配给任何对象:
qr'root'的新密码:\s*。因此,在一个空洞的环境中使用
qr
似乎毫无用处。请显示更多代码。我已经添加了我强烈建议不要使用
开关的代码。这是一个源过滤器。你的程序中确实有随机的
qr
表达式。这就像写“你好”;“你今天怎么样?”。它什么也没做。你有一个匿名的sub,带有
qr/
表达式,可以创建Regexp对象,但是在void上下文中,所以它们是无用的<代码>qr'root'的新密码:\s*不做任何事情,regexp对象不会传递给任何对象。这在下面几行再次发生。