【问题标题】:Remote Tailing Using ssh2_fetch_stream使用 ssh2_fetch_stream 进行远程拖尾
【发布时间】:2018-03-19 12:02:54
【问题描述】:

我正在尝试使用 phpseclib 进行远程跟踪。我设法使用以下代码做到这一点:

<?php
include('Net/SSH2.php');
include('Crypt/RSA.php');
$server = $_POST['server'];

$ssh = new Net_SSH2($server);
$key = new Crypt_RSA();
$key->loadKey(file_get_contents('/home/{username}/.ssh/id_rsa'));
if (!$ssh->login('{username}', $key)) {
    exit('Login Failed');
}

$tail="tail -n 1 {some lof file}";

while ($ssh->isConnected()) {   
        $ssh->exec(
            $tail, function ($str) {
                echo $str;
                echo "<br>";
                flush();
                ob_flush();
            }
        );
}
?>

上面代码的问题是它记录了重复的条目,我被告知如果我们必须更改我们的日志文件调试级别,它将无法足够快地读取日志文件。建议我看看 ssh2_fetch_stream。我试过这个,但老实说我很困惑。这是我目前的代码:

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

$host = $_POST['server'];
$username = "{username}";
$publicKey = "/home/{username}/.ssh/id_rsa.pub";
$privateKey = "/home/{username}/.ssh/id_rsa";
$log = "{some log file}";

$conn = ssh2_connect($host);

if (ssh2_auth_pubkey_file($conn, $username, $publicKey, $privateKey)){
        $stream = ssh2_exec($conn, 'tail -n 1 {some log file}');
        $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);

        if (ob_get_level() == 0)
                        ob_start();

                while ($stream_out) {
                        $line = fgets($stream_out);
                        echo $line.'<br />';
                        ob_flush();
                        flush();
                        sleep(1);
                }
                fclose($stream_out);
                ob_end_flush();
}
?>

上面的代码只打印了一行,因为我不能再使用“while ($ssh->isConnected())”了,我不知道如何循环。我认为它是循环的,但不是循环它应该循环的。不幸的是,因此我无法测试这是否会足够快地读取日志文件。

任何帮助或指点将不胜感激。我希望这个解决方案能奏效,因为我不允许在远程服务器上安装任何我应该跟踪的日志文件。

【问题讨论】:

    标签: php ssh phpseclib


    【解决方案1】:

    有人告诉我,如果我们必须这样做,它不会足够快地读取日志文件 更改我们的日志文件调试级别

    谁告诉你那是错的。 phpseclib 读取 SSH 服务器发送的内容,这正是 libssh2(或任何 SSH 客户端)所做的。

    上面代码的问题是它记录了重复的条目

    这是有道理的。 tail -n 1 filename 显示日志文件中的最后一个条目。如果创建条目之间有 10 分钟的间隔,并且在那 10 分钟内运行该命令 100 次,那么您将看到 100 个重复条目。

    我的建议:这样做(使用 phpseclib):

    $ssh->setTimeout(0);
    
    $tail = 'tail -f /path/to/logfile';
    
    $ssh->exec(
                $tail, function ($str) {
                    echo $str;
                    echo "<br>";
                    flush();
                    ob_flush();
                }
    );
    

    即。没有 while 循环,没有运行相同的命令无数次,等等。只需一个命令,运行一次就永久了。

    【讨论】:

    • 谢谢纽伯特。我简直不敢相信你做的这么容易。像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2012-08-16
    • 2017-08-31
    • 2013-06-15
    • 1970-01-01
    • 2014-02-09
    • 2011-05-03
    相关资源
    最近更新 更多