Waiting for command to finish using SSH2_Shell in PHP

牧云@^-^@ 提交于 2019-12-24 10:09:29

问题


I have an SSH2_Shell session working in PHP. my issue is that i need a command to completely finish before moving onto the next command. Here is my code so far:

    $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);

the tcpdump.sh script is running a lftp command but is not being given anough time to complete. I cant use sleep as it may take longer then the specified time and i dont want to make the user wait if it only needs a few seconds. I have not had luck implementing stream_set_blocking as when i do, it seems to freeze up my browser.

overall, I need a way to detect when a command has finished and move into the next command.

Thanks in advance!


回答1:


Thanks for the ideas but I think I got it solved. I did an echo of a few special characters when the command finished and then I would search for the characters using strpos(). Another thing I think may have helped was adjusting the max_execution_time setting in the php.ini file. I found that answer here:

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

And here is my new code

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



回答2:


I have an SSH2 class that implements the Secure Shell2 over on github .. check out https://github.com/bubba-h57/PHP-SSH2 and see if that helps.

I continue to search for a better way to handle finding the prompts though, so any advice or contribution to that would be welcomed. Hopefully it will help, if nothing more than giving you some ideas.




回答3:


You could use phpseclib, a pure PHP SSH implementation. eg.

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

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

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

If you really need shell support you could do the following (with the latest 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]');
?>


来源:https://stackoverflow.com/questions/5724277/waiting-for-command-to-finish-using-ssh2-shell-in-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!