我已经创建了一个连接到主机并执行一些命令的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);
?>
你有没有成功过这样的事情?我真的不知道该怎么做:(
答案 0 :(得分:0)
你为什么不用php的ssh?看起来ssh部分比你在perl中做的更容易,你仍然可以使用preg_函数获得perl正则表达式。
答案 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”并等待“密码:”或“用户名@用户名:〜”。