php - 使用 ssh2_fetch_stream 进行远程尾随

标签 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();
}
?>

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

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

最佳答案

I was told that it will not read the log file fast enough if we had to change our log file debug level

无论是谁告诉你的,都是错误的。 phpseclib 读取 SSH 服务器发送的内容,这正是 libssh2(或任何与此相关的 SSH 客户端)所做的事情。

The problem with the code above is that it logs duplicate entries

这是有道理的。 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 循环,没有无数次运行相同的命令,等等。只需一个命令,运行一次并永久运行。

关于php - 使用 ssh2_fetch_stream 进行远程尾随,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48687579/

相关文章:

phpseclib ssh2 启用 tty

java - 将 PHP 生成的公钥转换为 Java 公钥

php - 如何设置 PHP 守护进程?

java - SSH命令无法启动远程java进程

git - 如何在 Bluehost 上安装 git 仓库

phpseclib 挂起网络服务器,直到所有命令运行完毕

php - 将数组从 php 发送到 html <li>

php - 将条形码 ID 作为输入传递给 HTML 表单

php - MYSQL:保存玩家的各种实例

c++ - 无法使用 libssh2 进行编译