等待命令在PHP中使用SSH2_Shell完成

时间:2011-04-20 00:23:55

标签: php ssh fwrite libssh2

我在PHP中使用SSH2_Shell会话。我的问题是我需要一个命令完全完成才能进入下一个命令。到目前为止,这是我的代码:

    $command_capture = "cd /mnt/NADS/scripts/";
    $command_capture2 = "./tcpdump.sh $capture_name $sleep";


    if (!($connection = ssh2_connect("172.20.1.18", 22))) {
        echo "fail: unable to establish connection";
    } 
    if (!ssh2_auth_password($connection, "root", "Hideandseek")) {
        echo "fail: unable to authenticate";
    }
    $stream = ssh2_shell($connection);

    fwrite($stream, $command_capture. PHP_EOL);
    sleep(1);
    fwrite($stream, $command_capture2 . PHP_EOL);
    sleep(5);
    $data="";
    while($buf = stream_get_contents($stream)){
        $data.=$buf;
    }
    echo $data;
    fclose($stream);

tcpdump.sh脚本正在运行lftp命令,但没有足够的时间来完成。我不能使用睡眠,因为它可能需要更长的时间,然后指定的时间,我不想让用户等待,如果它只需要几秒钟。我没有幸运实现stream_set_blocking,就像我一样,似乎冻结了我的浏览器。

总的来说,我需要一种方法来检测命令何时完成并进入下一个命令。

提前致谢!

3 个答案:

答案 0 :(得分:1)

感谢您的想法,但我想我已经解决了。当命令结束时,我对一些特殊字符进行了回显,然后我将使用strpos()搜索字符。我认为可能有帮助的另一件事是调整php.ini文件中的max_execution_time设置。我在这里找到答案:

http://verysimple.com/2006/03/30/fatal-error-maximum-execution-time-of-30-seconds-exceeded/

这是我的新代码

    $data="";
    while (true){
        $data .= stream_get_contents($stream);
        if (strpos($data,"XOXO") !== false) {
            echo "okay: command finished\n";
            break;
        }
    }
    echo $data;
    fclose($stream);

答案 1 :(得分:0)

我有一个SSH2类,它在github上实现了Secure Shell2 ..查看https://github.com/bubba-h57/PHP-SSH2并查看是否有帮助。

我继续寻找更好的方法来处理寻找提示,所以任何建议或贡献都会受到欢迎。希望它能提供帮助,只不过是给你一些想法。

答案 2 :(得分:0)

您可以使用phpseclib, a pure PHP SSH implementation。例如

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2();
$ssh->login('username', 'password');

echo $ssh->exec('command');
echo $ssh->exec('command2');
?>

如果您真的需要shell支持,可以执行以下操作(使用最新的SVN):

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2();
$ssh->login('username', 'password');

$ssh->read('[prompt]');
$ssh->write("command\n");
echo $ssh->read('[prompt]');
$ssh->write("command\n");
echo $ssh->read('[prompt]');
?>