2011-08-03 74 views
0

我创建了一个连接到主机并执行一些命令的Perl脚本,它工作正常!我kinf感到骄傲,因为我是用Perl真正福利局^^ ...调用通过SSH连接到主机的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调用它...

我曾尝试不同的方式:

一样叫我的perl脚本与EXEC()函数

<?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 Connexion公司在所有的)...

我也尝试使用PECL Perl interpreter for PHP,打电话给我的剧本那样:

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

但我没有计算出如何发送一些arg到我的脚本中。

事实是,我需要用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); 
?> 

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

+2

你可以用'system()'而不是'exec()'来试试脚本吗?这应该将命令行输出打印到屏幕上。 – Legolas

+0

检查你的php.ini中的php安全模式选项,也许它已启用。 – Zyava

+0

@Zyava:我查过了,它已被禁用。感谢 – Franquis

回答

0

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

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

+0

我尝试使用PHP和PHPSECLIB :: SSH2函数的SSH ......事实是perl中的'expect'函数是唯一的工作解决方案,因为我不知道主机对我的命令的答案是什么在我发送它们之前... – Franquis

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('[email protected]:~$'); 
$sftp->write("sudo ls -la\n"); 
$output = $sftp->read('#Password:|[email protected]:~\$#', NET_SSH2_READ_REGEX); 
echo $output; 
if (preg_match('#Password:#', $lines)) { 
    $ssh->write("password\n"); 
    echo $sftp->read('[email protected]:~$'); 
} 
?> 

它会执行“sudo ls -la”并等待“Password:”或“username @ username:〜”。

相关问题