在远程计算机上从php发出多个bash命令

时间:2015-02-08 18:03:20

标签: php bash ubuntu ssh amazon-ec2

我尝试发出:

sudo apt-get update

sudo apt-get install openjdk-7-jre joe wget

在php的远程计算机上,

我一直在四处寻找并尝试了两种方法:

第一

session_start();

$command = "ssh -o 'StrictHostKeyChecking no' -i /var/www/.ssh/my-keypair555.pem ubuntu@{$_SESSION['host']} \"sudo apt-get update\"";

echo $command."<br/>";

echo exec($command, $output);

print_r($output);

$command = "ssh -o 'StrictHostKeyChecking no' -i /var/www/.ssh/my-keypair555.pem ubuntu@{$_SESSION['host']} \"sudo apt-get install -y openjdk-7-jre joe wget\"";

echo $command."<br/>";

echo exec($command, $output);

print_r($output);

此代码似乎根本没有执行, (命令被打印但输出数组似乎是空的。)

其次: 来自http://php.net/manual/en/function.ssh2-exec.php

的改编版本
session_start();

$connection = ssh2_connect($_SESSION['host'], 22, array('hostkey'=>'ssh-rsa'));

if (ssh2_auth_pubkey_file(
    $connection, 
    'ubuntu',
    '/var/www/.ssh/id_rsa.pub',
    '/var/www/.ssh/id_rsa')
    ) {

    $shell = ssh2_shell($connection,"bash"); 

    $cmd = "echo '[start]';sudo apt-get update;sudo apt-get install -y openjdk-7-jre joe wget;echo '[end]'"; 
    $output = user_exec($shell,$cmd); 

    fclose($shell); 

    echo $output."<br/>";

} else {

    die('Public Key Authentication Failed');
}

function user_exec($shell,$cmd) { 
    fwrite($shell,$cmd . "\n"); 
    $output = ""; 
    $start = false; 
    $start_time = time(); 
    $max_time = 900; //time in seconds 
    while(((time()-$start_time) < $max_time)) { 
        $line = fgets($shell); 
        //echo $line;
        if(!strstr($line,$cmd)) { 
            if(preg_match('/\[start\]/',$line)) { 
                $start = true; 
                echo "start";
            }elseif(preg_match('/\[end\]/',$line)) { 
                return $output; 
            }elseif($start){ 
                $output[] = $line; 
                echo $line."<br/>";
            } 
        } 
    } 
}   

如果我使用此代码命令:

echo '[start]';sudo apt-get update;sudo apt-get install -y openjdk-7-jre joe wget;echo '[end]'
如果我登录到计算机并发出

,则会显示

history

但似乎没有被执行,因为如果我发出

java

我收到了需要安装它的消息。

如果我发出

!1

apt-get update和apt-get install可以正确执行。

如果我在浏览器中运行php文件,我会得到以下输出:

欢迎使用Ubuntu 14.04.1 LTS(GNU / Linux 3.13.0-36-generic x86_64)*文档:https://help.ubuntu.com/系统信息发布日期:Sun Feb 8 17:20:45 UTC 2015系统负载:0.69进程:104使用/:9.8%7.74GB登录用户:0内存使用率:eth0的1%IP地址:10.74.190.178交换使用率:0%绘制此数据并管理此系统:https://landscape.canonical.com/获取云支持Ubuntu Advantage Cloud Guest:http://www.ubuntu.com/business/services/cloud 0个软件包可以更新。 0更新是安全更新。上次登录时间:2015年2月8日星期二17:20:50来自ec2-54-77-56-210.eu-west-1.compute.amazonaws.com echo'[start]'; sudo apt-get update; sudo apt- get install -y openjdk-7-jre joe wget; echo'[end]'ubuntu @ ip-10-74-190-178:〜$ echo'[start]'; sudo apt-get update; sudo apt-get in

  • 很多空行,偶尔会有一条双重消息 ALAL 要么 l -l -

- &GT;请注意,该命令在'install'

处被截断

这可以解释为什么命令没有被执行。

任何人都可以帮我解决这个问题,我现在已经找了差不多两个星期而且似乎没有取得很大进展......

感谢,

桑德

1 个答案:

答案 0 :(得分:0)

显然php.ini中的max_execution_time是这里的问题。

我用

调试了第二个脚本
...
}elseif(preg_match('/\[end\]/',$line)) { 
    echo "[end]:".$line;
    return $output; 
}elseif($start){ 
...

    } //while loop
    echo "out of time";
}//function user_exec($shell,$cmd) { 

并且都没有在浏览器页面的输出中执行。

$max_time = 900; //time in seconds 

还不够,应该用:

set_time_limit(900);

执行了原始命令,但在执行时,php的超时停止了执行。

此外,第一个脚本应该遇到同样的问题,执行命令和执行过程中返回的php只需要很长时间。

我也是,但我认为这不是导致问题的原因:

$stream = ssh2_exec($connection,$cmd);

而不是原来的

fwrite($shell,$cmd . "\n"); 

总脚本:

<?php

sleep(30);

session_start();

$connection = ssh2_connect($_SESSION['host'], 22, array('hostkey'=>'ssh-rsa'));

if (ssh2_auth_pubkey_file(
    $connection, 
    'ubuntu',
    '/var/www/.ssh/id_rsa.pub',
    '/var/www/.ssh/id_rsa')
    ) {

    $cmd = "echo '[start]';sudo apt-get update;sudo apt-get install -y openjdk-7-jre joe wget;echo '[end]'"; 

    $output = user_exec($connection,$cmd); 

    fclose($shell); 

    ob_end_flush();

    echo $output."Halleluia!!!";

} else {

    die('Public Key Authentication Failed');
}

function user_exec($connection,$cmd) { 
    $stream = ssh2_exec($connection,$cmd);

    $output = ""; 
    $start = false; 
    $start_time = time(); 

    set_time_limit(900);

    $max_time = 900; //time in seconds 
    while(((time()-$start_time) < $max_time)) { 
        $line = fgets($stream); 
        if(!strstr($line,$cmd)) { 
            if(preg_match('/\[start\]/',$line)) { 
                $start = true; 
            }elseif(preg_match('/\[end\]/',$line)) { 
                echo "[end]:".$line;
                return $output; 
            }elseif($start){ 
                if($line != ""){
                    ob_flush();
                    flush();
                    $output[] = $line; 
                    echo $line."<br/>";
                }
            } 
        } 
    } 
    echo "out of time";
}   
?>

希望这可以帮助任何有类似问题的人。

S上。