调用使用SSH连接到主机的PERL脚本


Call a PERL script which connect to a host with SSH

我创建了一个Perl脚本,它连接到主机并执行一些命令,它工作得很好!我有点骄傲,因为我是一个真正的Perl新手^^…

perl脚本概述:

use Expect;             
$|=0;                        
$Expect::Debug=0;       
$Expect::Exp_Internal=0;
$Expect::Log_Stdout=1; 
my $ip = $ARGV[0];
my $file = $ARGV[1];
my $username = $ARGV[2];
my $password = $ARGV[3];
open(CONF,$file) || die "File not found";
while(<CONF>){
    $con .= $_;
}
my @conf = split("#",$con);
my $ssh = Expect->spawn("ssh -q -l $username $ip") || die "Spawn ssh failed, $!";
  if($ssh->expect(5,"yes")) {
      print $ssh "yes'r";
   if($ssh->expect(10,"assword")) {
    print $ssh "$password'r";
   }
   else {
          warn $ssh->exp_error()."'n";
          next;
   }
  }
  elsif($ssh->expect(10,"assword")) {
   print $ssh "$password'r";
   }
  else {
         warn $ssh->exp_error()."'n";
          next;
  }
  #Variables Globales
  my $rcmd;        
  my @lcmd;        
  my $lrcmd;       
  $regExpCmd = "'#";
  $regExpCmd2 = "^(A|B).*('$|'#)";
  $regExp = "'n"; 
  $ssh->expect(10,$regExpCmd);
  my $cmd0 = "environment no more'r";
  my $cmdExit = "logout'r";
  $ssh->send($cmd0);
  $ssh->expect(5,$regExpCmd);
  foreach my $step (@conf) {
      my @lines = split("'n",$step);
      foreach my $val (@lines){
        $val =~ s/^'s+//;
        $val =~ s/'r//;
        $ssh->send("$val'r");
        $i *= 1;
        if(!$ssh->expect(2,$regExpCmd2)){
            $i *= 0;                
        #   if($ssh->expect(1,"MINOR")){
        #       die "Erreur mineur: $val";}
            if($ssh->expect(2,"Error")){
                die "Erreur majeur: $val";
            }
        }
      }
       $ssh->expect(1,$regExpCmd2);
  }
  $ssh->send($cmdExit);
  print $i;

现在,我想从PHP调用它…

我试过不同的方法:

就像用exec()函数调用我的perl脚本:
    <?php
$arg1 = "MY.ADD.IP";
$arg2 = "MY/FILE";
$arg3 = "USERNAME";
$arg4 = "PASSWORD";
    $result = exec("perl /path/of/perl/script.pl $arg1 $arg2 $arg3 $arg4");
    if($result == 1) {
      return true: }
    else {
       return false;
    } ?>

但它没有做任何事情(在远程主机上检查,所以SSH连接)…

我还尝试使用PECL Perl解释器PHP,调用我的脚本如下:

<?php
$perl = new Perl();
$perl->require('myperl.pl'); ?>

但我不知道如何发送一些参数到我的脚本..

事实是我需要用jQuery $来调用它。ajax请求,我需要等待脚本的结束之前发送回任何"答案"jQuery。

我所尝试的一切都不起作用,因为PHP脚本在Perl脚本之前结束…

PS:我还尝试在PERL中创建一个用PHP调用的包,如下所示:

package Connect;
sub new{
#Init some var... }
sub connect {
#Something like the script above.....
}

<?php 
$perl = new Perl();
$perl->require('myscript.pl');
$perl->call('connect',$args);
?>

你曾经成功过这样的事情吗?我真不知道该怎么办

为什么不在php中使用ssh呢?看起来ssh部分比在perl中所做的更容易,并且您仍然可以使用preg_函数获得perl正则表达式。

PHP.net ssh2手册页PHP.net preg_match手册页

phpseclib,一个纯PHP SSH实现,有一些非常类似的东西。

示例如下:

<?php
include('Net/SSH2.php');
$sftp = new Net_SSH2('www.domain.tld');
$sftp->login('username', 'password');
echo $sftp->read('username@username:~$');
$sftp->write("sudo ls -la'n");
$output = $sftp->read('#Password:|username@username:~'$#', NET_SSH2_READ_REGEX);
echo $output;
if (preg_match('#Password:#', $lines)) {
    $ssh->write("password'n");
    echo $sftp->read('username@username:~$');
}
?>

它执行"sudo ls -la"并等待"Password:"或"username@username:~"