我正在尝试使用 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;了。我认为它是循环但不循环它应该是什么。不幸的是,由于这个原因,我无法测试是否能够足够快地读取日志文件。
非常感谢任何帮助或指示。我希望这个解决方案能够正常工作,因为我不允许在远程服务器上安装任何我应该拖尾的日志文件。
答案 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循环,没有运行相同的命令数十亿次等等。只需一个命令,运行一次,永久性。