远程拖尾使用ssh2_fetch_stream

时间:2018-02-08 14:14:02

标签: php ssh phpseclib

我正在尝试使用 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();
}
?>

上面的代码只打印一行,因为我不知道如何进行循环,因为我不能使用&#34; while($ ssh-&gt; isConnected())&#34;了。我认为它是循环但不循环它应该是什么。不幸的是,由于这个原因,我无法测试是否能够足够快地读取日志文件。

非常感谢任何帮助或指示。我希望这个解决方案能够正常工作,因为我不允许在远程服务器上安装任何我应该拖尾的日志文件。

1 个答案:

答案 0 :(得分: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循环,没有运行相同的命令数十亿次等等。只需一个命令,运行一次,永久性。