Skip to content Skip to footer

高效分页获取SSH日志的实现

高效分页获取SSH日志的实现Linux各版本下的SSH日志区别日志存放位置

Rehat系列的: /var/log/secure

Ubuntu/Debian:/var/log/auth.log

auth.log的权限组为syslog:adm chown syslog:adm /var/log/auth.log

确保sshd_config中的LogLevel为ERROR以下

journal:journalctl -u ssh --no-pagers可以查看

高效的获取日志这些日志通常不会被清理而是会被syslog根据配置来滚动压缩如果时公网机器每天大概能产生6k-2w条的SSH日志(有扫描机一直在SSH爆破)日积月累,要查询全部日志时消耗的时间也会很久例如cat /var/log/secure

直接使用SHELL获取全部是数据的痛点:

执行慢,shell需要去读取一遍全部文件,并且到python中也要进行读取

解析慢,需要split切分行之后 还要挨条遍历,这速度是真的很拉

占用内存多,切割的其他没用数据也要放在内存中极度占用内存

1.仅获取数据如下代码可以实现分页+搜索功能,最终输出会返回分页条数的数据

123456commands = "ls -tr {file_path}|grep -v '\.gz$'|xargs cat|grep -aE '({login_type})'{query}|tail -n {end}|head -n {pagesize}|tac".format( file_path=self.ssh_log_path, login_type=login_type, query=query, end=end, pagesize=pagesize)

2.将分页和总条数组合到标准输出通过这种方式可以同时获取分页的数据以及总条数的输出返回,需要自己解析output

1commands = """(ls -tr /var/log/secure | grep -v '\.gz$' | xargs cat | grep -aE '(Failed password|Accepted)') | tee >(wc -l) >(tail -n 20 | head -n 10 | tac) > /dev/null"""

3.利用输出通道 将两份数据输出至两个通道通过这种方式可以同时获取当前分页的条数 以及总条数将分页数据输出到error将wc -l的条数输出至标准输出

1234567commands = "ls -tr {file_path}|grep -v '\.gz$'|xargs cat|grep -aE '({login_type})'{query}| tee >(tail -n {end}|head -n {pagesize}|tac >&2)|wc -l".format(file_path=self.ssh_log_path,login_type=login_type,query=query,end=end,pagesize=pagesize)