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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容