【发布时间】: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())”了,我不知道如何循环。我认为它是循环的,但不是循环它应该循环的。不幸的是,因此我无法测试这是否会足够快地读取日志文件。
任何帮助或指点将不胜感激。我希望这个解决方案能奏效,因为我不允许在远程服务器上安装任何我应该跟踪的日志文件。
【问题讨论】: