我在Linux sshield中创建了一个服务,用于通过ssh保护暴力攻击。我的服务已经完成,并且一切运行良好。
但是...我看到了一些细节。此服务消耗大量CPU!
它消耗了20.6%,实在太多了
我的服务在一秒钟的循环无限时间内运行。会导致CPU占用过多吗?其他是什么?
GitHub:https : //github.com/cleanet/sshield
评论Shield:https : //www.youtube.com/watch? v = 0rj4j7VqXXI
我编辑了脚本,删除了以下内容:
lineas_antiguas=$(wc -l /var/log/auth.log);
IFS=" " read -ra lineas_antiguas <<< $lineas_antiguas;
添加常量:
declare -r SSHIELD_LOG_FILE="/var/log/sshield.log"
declare -r AUTH_LOG_FILE="/var/log/auth.log"
并用它替换路径。另外,我将while循环替换为:
tail -F -n 0 "$AUTH_LOG_FILE" | while read line
do
...
done
并删除:
lineas=$(wc -l /var/log/auth.log);
IFS=" " read -ra lineas <<< $lineas;
linea_contenido=$(tail -n 1 /var/log/auth.log);
我的脚本已在我的GITHUB中更新
结果是,它并没有消耗太多的CPU和内存0.3%的CPU和0.2%的RAM
但。为什么重复服务
如果我没看错,那么您从头开始就不断地在文件中计数行/var/log/auth.log
,并且在做一些事情:
while [ TRUE ]
do
lineas=$(wc -l /var/log/auth.log);
...
ip_logueada=$(wc -l /var/log/auth.log | grep -E -o "[0-9]{1,9}")
....
done
因此,承受压力的不仅是CPU,还包括硬盘。
如果确实必须从头开始处理日志文件以计算行数或收集统计信息,则在脚本启动时仅执行一次,不要循环重复此操作,这是浪费和不必要的。
您想要的是正在监视的文件的某种尾巴。因此,您可能会遇到以下情况:
tail -n0 -F /var/log/auth.log | while read line
do
echo "$line"
# do something
done
在将新行写入文件时,此代码段将回显新行。因此,您只需要“侦听”新行流,对其进行解析并跟踪有问题的IP地址。这种方法应该可以解决您的性能问题。
一点建议:对源文件和目标文件使用变量名。例如/var/log/auth.log
,在您的代码中重复了多次,所以也是如此/var/log/sshield.log
。
您可以在脚本的开头添加一些变量,甚至可以将它们声明为常量(只读变量),如下所示:
declare -r SOURCE_LOG_FILE="/var/log/auth.log"
然后,您可以简单地编写:tail -n0 -F "$SOURCE_LOG_FILE"
。这样就避免了重复。
我还将代码分成几个功能块。例如,您可以拥有:
这样可以使代码更清晰,更易于维护。现在,流程不容易遵循,并且代码无处不在。
您还应该具有将警报记录到文件的功能/var/log/sshield.log
。您有很多重复的行,例如:
echo "logged ip: $ip_logueada - $(date)" >> /var/log/sshield.log
创建一个函数,然后仅将要记录的文本作为参数传递,然后让该函数添加时间戳并将文本写入文件,并以所需的方式进行格式化。通过消除冗余,可以大大简化代码。
现在,我必须同意,您正在重新发明轮子,有免费的工具可以越来越有效地工作。这项运动对教育有好处。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句