使用 ssh2_fetch_stream 远程尾随
Remote Tailing Using ssh2_fetch_stream
我正在尝试使用 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
显示日志文件中的最后一个条目。如果输入之间有十分钟的间隔,并且在那十分钟内,您 运行 该命令 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 循环,没有 运行 无数次使用相同的命令,等等。只有一个命令,运行 一次并永久使用。
我正在尝试使用 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
显示日志文件中的最后一个条目。如果输入之间有十分钟的间隔,并且在那十分钟内,您 运行 该命令 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 循环,没有 运行 无数次使用相同的命令,等等。只有一个命令,运行 一次并永久使用。