需求:
测试工程师 提交bug时,需要附上日志文件,但linux系统(阉割版)没有直接取日志的功能,而且日志文件存在多个,手动搭建环境取日志费时费力,为了提高取日志的效率可使用python完成进行自动化取日志功能
代码:
import paramiko
class LogExport(object):
def __init__(self,ip,username,password,local):
self.ip = ip
self.username = username
self.password = password
self.local = local
def compress(self):
ssh = paramiko.SSHClient() # 实例化SSH客户端
policy = paramiko.AutoAddPolicy() # 创建默认的白名单
ssh.set_missing_host_key_policy(policy) # 设置白名单
ssh.connect(hostname=self.ip,port=22,username=self.username,password=self.password)
i=0
while i < 3:
stdin,stdout,stderr = ssh.exec_command("tar -zcvf /test/log.tar.gz /test/log")
print("日志压缩中,请等待。。。")
#print(stdout.read().decode("utf-8")) #压缩结果展示
stdin,stdout,stderr = ssh.exec_command("ls /test")
result1 = str(stdout.read().decode())
result2 = "log.tar.gz"
if result2 in result1: #判端日志压缩包是否打包成功
ssh.close()
print("日志压缩完成,即将导出。。。")
# return "success"
self.export() #存在即导出
break
else:
# return "false"
i = i+1
if i == 3:
print('日志压缩失败')
def export(self):
scp = paramiko.Transport((self.ip,22))
scp.connect(username=self.username,password=self.password)
sfcp = paramiko.SFTPClient.from_transport(scp)
remote_path = "/test/log.tar.gz" #导出原地址
local_path = self.local
sfcp.get(remote_path,local_path)
scp.close()
print("日志导出完成")
self.delete() #设备中删除压缩文件
def delete(self):
ssh = paramiko.SSHClient()
policy = paramiko.AutoAddPolicy()
ssh.set_missing_host_key_policy(policy)
ssh.connect(hostname=self.ip,port=22,username=self.username,password=self.password)
stdin,stdout,stderr = ssh.exec_command("ls /test")
result3 = str(stdout.read().decode("utf-8"))
result4 = "log.tar.gz"
if result4 in result3:
stdin,stdout,stderr = ssh.exec_command("rm -rf /test/log.tar.gz")
else:
print("日志压缩文件不存在")
if __name__ == "__main__":
ip = "192.168.x.x"
username = "ssh账号"
password = "ssh密码"
local = "D:\\Log\\log.tar.gz" #导出目标地址
start = LogExport(ip,username,password,local)
start.compress()
print ("日志导出地址:",local)
执行:
测试结果: