Monday, April 7, 2014

configure a remote computer in a perl script

###############################################
#script sshCmdExpect.sh
###############################################
#!/usr/bin/expect -f

spawn ssh [lindex $argv 1]@[lindex $argv 0]

expect "yes/no" {
    send "yes\r"
    expect "*?assword" { send "[lindex $argv 2]\r" }
    } "*?assword" { send "[lindex $argv 2]\r" }

expect "[lindex $argv 1]@*$ " { send "[lindex $argv 3]\r" }
if {$argc >= 5} {
    expect "*?assword" { send "[lindex $argv 4]\r" }
    if {$argc > 5} {
        expect "*@*\[#$\] " { send "[lindex $argv 5]\r" }
    }
}
expect "[lindex $argv 1]@*$ " { }

###############################################
#perl script
###############################################
sub sshRunCmd {
  my ($host, $login, $passwd, $cmd) = @_;
  my $suPasswd = $_[4] || "NULL";
  my $cmdAfterSu = $_[5] || "NULL";
  my $result;
  if("$suPasswd" eq "NULL") {
      $result = `./sshCmdExpect.sh $host $login $passwd "$cmd"`;
  }
  elsif("$cmdAfterSu" eq "NULL") {
      $result = `./sshCmdExpect.sh $host $login $passwd "$cmd" $suPasswd`;
  }
  else {
      $result = `./sshCmdExpect.sh $host $login $passwd "$cmd" $suPasswd "$cmdAfterSu"`;
      print "./sshCmdExpect.sh $host $login $passwd $cmd $suPasswd $cmdAfterSu\n";
  }
  exit;
  my @resultLines = split /\n/, $result;

  my @newResultLines;
  my $ctrl = 0;
  foreach my $line (@resultLines) {
      if("$cmdAfterSu" eq "NULL") {
          if($line =~ /$cmd/) {
              $ctrl = 1;
          }
      }
      elsif("$cmdAfterSu" ne "NULL") {
          if($line =~ /$cmdAfterSu/) {
              $ctrl = 1;
          }
      }
      elsif($ctrl == 1) {
          push @newResultLines, $line;
      }
  }

  return \@newResultLines;
}

$cmd = "su root";
$perlCmd = 'perl -pi -e \'s/127.0.1.1(\s+localhost)/'.${ipAddr}.'\${1}/\' /etc/hosts';
my $ipAddrChangePtr = &sshRunCmd($ipAddr, $login, $passwd, $cmd, $rootPasswd, $perlCmd);