1

我有一个在 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,它似乎冻结了我的浏览器。

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

提前致谢!

4

3 回答 3

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);
于 2011-04-25T18:07:42.977 回答
0

您可以使用phpseclib,一个纯 PHP SSH 实现。例如。

<?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]');
?>
于 2011-04-23T15:43:39.500 回答
0

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

不过,我继续寻找更好的方法来处理查找提示,因此欢迎任何建议或贡献。希望它会有所帮助,如果只是给你一些想法。

于 2011-04-21T17:01:14.720 回答