美文网首页
python远程执行命令、上传下载文件(数据库备份/还原)

python远程执行命令、上传下载文件(数据库备份/还原)

作者: sai德很黑 | 来源:发表于2021-07-11 16:51 被阅读0次
1、背景

这篇博客主要是对“数据清洗”而言的。数据清洗在自动化测试中有什么作用呢。做过接口自动化测试的都知道,测试会造一些测试数据验证接口是否正常。这些测试数据最终会去到数据库里。这就是我们所说的测试脏数据。为了保证这些脏数据不影响后面的测试,在执行自动化测试前先要把原有数据库进行数据备份,在测试完成后对数据库恢复,这就做到了数据“隔离”、“备份”、“恢复”。测试数据不对原有的数据造成任何影响。不知道解释清楚了没有~~~

2、最终效果

测试前:数据库备份
测试结束:数据还原

3、安装第三方库
  pip install paramiko
4、连接、操作Linux、
import paramiko


# 创建ssh客户端
ssh_client = paramiko.SSHClient()

# 自动接受连接
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接Linux
# 方式一:用户名+密码连接
ssh_client.connect(hostname='ip',port=22,username='用户名',password='密码')

# 方式二:用户名+密钥(未调试)
# ssh_client.connect(hostname='ip',port='端口',username='用户名',password='密码', pkey=paramiko.RSAKey.from_private_key_file('密钥文件路径'))

#操作Linux
"""
    stdin :执行输入     stdout:执行结果     stderr:标准错误结果输出
"""
stdin, stdout, stderr = ssh_client.exec_command('linux命令')

#默认返回时<bytes>
#转为字符串输出
print(stdout.read().decode('utf-8'))

# 关闭连接
ssh_conn.close()

输出结果是/root

5、文件上传、下载
# 创建连接
ssh_conn = paramiko.Transport('IP',22)

# 连接linux
ssh_conn.connect(username='用户名',password='密码')

# 创建sftp客户端
sftp_client = paramiko.SFTPClient.from_transport(ssh_conn)

# 上传 (localpath:本地路径, remotepath:远程路径)
# sftp_client.put(localpath=r'C:\Users\Mr.he\Desktop\apiAutoTest\log\run2021-07-03_16-43-58_518374.log', remotepath='/root/mylog.log')

# 下载
sftp_client.get(remotepath='/root/mylog.log', localpath=r'C:\Users\Mr.he\Desktop\apiAutoTest\log\mylog.log')

# 关闭连接
ssh_conn.close()

执行后,在在服务器/本地 下载/上传文件

5、代码封装
class LinuxTools:
    # 初始化
    def __init__(self,host,port,username,password=None,private_key_file=None):
        """
        :param host: 服务器IP (str)
        :param port: 服务器端口 (int)
        :param username: 服务器登录用户名称 (str)
        :param password: 服务器密码 (str)
        :param private_key_file: 私钥文件路劲 (str)
        """
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.private_key_file = private_key_file


        # 创建ssh客户端
        ssh_client = paramiko.SSHClient()
        # 自动接受服务器发过来的密钥
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            # 判断是密码方式登录还是私钥方式登录
            if self.password is None:
                private = paramiko.RSAKey.from_private_key_file(self.private_key_file)
                ssh_client.connect(hostname=self.host, port=self.port, username=self.username, pkey=private)

            else:
                ssh_client.connect(hostname=self.host, port=self.port, username=self.username, password=self.password)
            self.ssh_client = ssh_client
        except Exception as e:
            print('连接失败!!!{}'.format(e))

    # 操作linux
    def handler_cmd(self,cmd):
        """
        :param cmd: linux操作命令,(str,list)
        """
        if isinstance(cmd, list):
            for c in cmd:
                stdin, stdout, stderr = self.ssh_client.exec_command(c)
        else:
            stdin, stdout, stderr = self.ssh_client.exec_command(cmd)
            print(stdout.read().decode())

    # 关闭连接
    def ssh_close(self):
        self.ssh_client.close()


class SFTPTools:
    """远程<-->本地,上传、下载操作"""
    def __init__(self,host,port,username,password=None,private_key_file=None):
        """
        :param host: 服务器IP (str)
        :param port: 服务器端口 (int)
        :param username: 服务器登录用户名称 (str)
        :param password: 服务器密码 (str)
        :param private_key_file: 私钥文件路劲 (str)
        """
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.private_key_file = private_key_file

        ssh_client = paramiko.Transport((self.host,self.port))
        try:
            # 判断是密码方式登录还是私钥方式登录
            if self.password is None:
                private = paramiko.RSAKey.from_private_key_file(self.private_key_file)
                ssh_client.connect(username=self.username, pkey=private)

            else:
                ssh_client.connect( username=self.username, password=self.password)
            # 这个地方我也不知道为什么,照抄吧~~~
            self.ssh_client = ssh_client
        except Exception as e:
            print('连接失败!!!{}'.format(e))

        self.ftp_client = paramiko.SFTPClient.from_transport(ssh_client)

    def handler_file(self,local_path,remote_path,is_upload=True):
    # try:
        if is_upload:
            self.ftp_client.put(localpath=local_path,remotepath=remote_path)
            print('上传成功')
        else:
            self.ftp_client.get(remotepath=remote_path,localpath=local_path)
            print('下载成功')
    # except Exception as e:
    #     print(e)

    def ssh_close(self):
        self.ssh_client.close()
        print('连接已关闭')

补充:
数据库备份:mysqldump -u root -p密码 数据库名称 > 备份路径.sql(备份文件.sql)
数据库还原:mysql -u root -p密码 数据库名称 < 备份路径

数据清理大致思路:在测试前备份到本地文件夹 -->在上传到服务器 -->测试执行完毕 -->在服务器上执行还原命令 。
目前是这么个想法,具体代码还木有开始写~~

6、参考资料

https://www.bilibili.com/video/BV1cQ4y1P7dg?p=5&spm_id_from=pageDriver
https://www.cnblogs.com/zy7y/p/14295902.html

创作不易,点个赞,关注下呗~~~

相关文章

网友评论

      本文标题:python远程执行命令、上传下载文件(数据库备份/还原)

      本文链接:https://www.haomeiwen.com/subject/mzpkpltx.html