我试图循环遍历一个文本日志文件,其中包含SSH登录和其他日志。
该程序返回SSH登录的总数。
我的解决方法可以工作,但速度有点慢(在200mo文件上需要约3.5秒)。我想知道是否有任何方法可以使它更快。我不太熟悉Java的最佳实践。
我正在使用BufferedReader类。也许有更好的类/方法,但我在网上找到的其他所有方法都比较慢。
最终输出为:
感谢您的时间!
编辑: Mo(Mega Octet)= MB(Mega Byte)(我们通常在法语中说Mo)
如果需要,这是完整的更新代码: https://pastebin.com/Kn5EqLNX
该程序返回SSH登录的总数。
我的解决方法可以工作,但速度有点慢(在200mo文件上需要约3.5秒)。我想知道是否有任何方法可以使它更快。我不太熟悉Java的最佳实践。
我正在使用BufferedReader类。也许有更好的类/方法,但我在网上找到的其他所有方法都比较慢。
{
BufferedReader br;
if(fileLocation != null) {
br = new BufferedReader(new FileReader(fileLocation));
}
else {
br = new BufferedReader((new InputStreamReader(System.in, "UTF-8")));
}
String line;
Stack<String> users = new Stack<>();
int succeeded = 0;
int failed;
int total = 0;
if(!br.ready()) {
help("Cannot read the file", true);
}
while((line=br.readLine())!=null)
{
if(!line.contains("sshd")) continue;
String[] arr = line.split("\\s+");
if(arr.length < 11) continue;
String log = arr[4];
String log2 = arr[5];
String log3 = arr[8];
String user = arr[10];
if(!log.contains("sshd")) continue;
if(!log2.contains("Accepted")) {
if(log3.contains("failure")) {
total++;
}
continue;
}
total++;
succeeded++;
if(!repeat) {
if (users.contains(user)) continue;
users.add(user);
}
System.out.println((total + 1) + " " + user);
}
完整代码:https://pastebin.com/xp2P9wja
此外,以下是日志文件的部分内容:
Dec 3 12:20:12 k332 sshd[25206]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.147.222.137
Dec 3 12:20:14 k332 sshd[25204]: error: PAM: Authentication failure for illegal user admin from 10.147.222.137
Dec 3 12:20:14 k332 sshd[25204]: Failed keyboard-interactive/pam for invalid user admin from 10.147.222.137 port 36417 ssh2
Dec 3 12:20:14 k332 sshd[25204]: Connection closed by invalid user admin 10.147.222.137 port 36417 [preauth]
Dec 3 12:20:40 k332 sshd[25209]: pam_tally2(sshd:auth): Tally overflowed for user root
最终输出为:
Total :
103 unique IP SSH logins succeeded
30387 SSH logins succeeded
17186 SSH logins failed
47573 total SSH logins
感谢您的时间!
编辑: Mo(Mega Octet)= MB(Mega Byte)(我们通常在法语中说Mo)
如果需要,这是完整的更新代码: https://pastebin.com/Kn5EqLNX
if
语句需要时间,您应该使用条件运算符(如&&
)组合它们。在控制台中打印也很耗时,您应该删除while
循环中的System.out.println
并等待进程结束,或者至少使用模数%
每100或1000个条目打印一次。 - gui3PasswordAuthentication no
的意思以及它是否会倾向于加强或减弱安全性吧? - g00seStack
不够高效。请使用HashSet
替代。(即使大部分 CPU 时间都不在这里。) - k314159