学习python自动化运维的第九天
今天学习的内容为对Linux服务器进行病毒查杀,所以,首先需要在Linux中安装免费的杀毒软件clamav,安装过程可参考其他博主的文章。我的参考文章是这篇文章;使用yum安装即可,如果虚拟机服务器无法访问互联网,可以通过离线的方式安装(参考其他文章吧,我的可以联网,就不讲述了)。
之后,在本地主机中安装python的第三方库,用于远程到Linux服务器上,通过远程执行命令的方式,获取扫描结果
pip install paramiko
当出现面对的服务器过多的情况,可以通过多线程的方式,同时对多台服务器进行扫描,以此提高工作的效率。具体的实现代码如:
# -*- coding: utf-8 -*-
"""学习python自动化运维的第九天"""
"""
从今天开始学习python与系统安全
通过在服务端安装clamav免费的杀毒软件,
然后通过python的paramiko库远程获取扫描结果
"""
import paramiko
from threading import Thread
import time
class Scan(Thread): # 多线程的类继承
def __init__(self,IP,scan_path): # 需要参数扫描终端地址和扫描路径
Thread.__init__(self) # 线程初始化
self.IP = IP
self.scan_path = scan_path
self.connstr = [self.IP]
self.error = ""
def run(self):
try:
result,client = [],paramiko.SSHClient() # 创建一个连接对象
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 第一次连接自动选择yes,不加可以进行选择
client.connect(hostname=self.IP,port=22,username='root',password='Wang123456') # 连接服务器
client.exec_command("freshclam") # 更新病毒库
now_time = time.strftime('%Y-%m-%d-%H%M%S',time.localtime(time.time())) # 获取当前系统时间
print("准备扫描目录: ",self.scan_path)
command = "clamscan -ri {} > /clamav/log/clamav-log-{}.log".format # 文件夹扫描
stdin, stdout, stderr = client.exec_command(command(self.scan_path,now_time)) # 命令执行
i=0
while True:
i+=1
if stdout.channel.exit_status_ready(): # 判断命令是否执行完成,完成则跳出循环,否则等待等待1秒
break
time.sleep(1)
print("\r扫描已用时%s秒"%i,end="",flush=True) # 覆盖打印输出
cmd1 = "cat /clamav/log/clamav-log-%s.log"%(now_time)
stdin, stdout, stderr = client.exec_command(cmd1) # 读取扫描结果
for line in stdout.readlines():
result.append(line.strip()) # 将获取的结果格式化(否则后面答印有空行)
client.close()
self.connstr += result # 保存扫描结果,用于外部读取
except TimeoutError as T :
self.error = self.IP+ "连接错误:" + str(T) # 保存连接错误的结果(服务器不存在,或者未开机,22端口未开放,总之,paramiko连接不上)
r =1 # 定义循环标志
threadnum = 2 # 指定开启线程数量
IPs = ["192.168.186.152","192.168.186.151","192.168.186.150"] # 定义扫描主机列表,不能同时多线程扫描一台主机
scanlist = [] # 创建线程列表
for ip in IPs:
currp = Scan(ip,"/tmp") # 使用线程类
scanlist.append(currp)
if r %threadnum == 0 or r == len(IPs): # 满足条件则开启线程
for task in scanlist:
task.start() # 开启线程
for task in scanlist:
task.join() # 等待所有子线程结束,
for line in task.connstr: # 获取返回结果
print(line)
if task.error != "":
print(task.error)
scanlist.clear() # 清除列表中的元素
r += 1
我最后的扫描结果如下(151,150的主机不存在):
以上部分就是今天的学习内容了,通过clamav和python第三方库paramiko结合的方式,实现了对远程主机的病毒扫描,clamav病毒库的更新。