我创建了一个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:~"