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

时间:2011-08-03 15:45:48

标签: php perl 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 interpreter for PHP,调用我的脚本:

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

但我没想到如何将一些arg发送到我的脚本..

事实是,我需要使用jQuery $ .ajax请求调用它,我需要等待脚本的结束,然后再向jQuery发送任何“回答”。

我尝试的所有内容都不起作用,因为PHP脚本在“Perl脚本之前”结束...

PS:我还试图用PHP调用PERL创建一个Package,如下所示:

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);
?>

你有没有成功过这样的事情?我真的不知道该怎么做:(

2 个答案:

答案 0 :(得分:0)

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

PHP.net ssh2 manual page PHP.net preg_match manual page

答案 1 :(得分:0)

phpseclib, a pure PHP SSH implementation,有一些非常相似的东西。

以下是一个例子:

<?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”并等待“密码:”或“用户名@用户名:〜”。