python遠(yuǎn)程執(zhí)行命令锥累、上傳下載文件(數(shù)據(jù)庫備份/還原)

1、背景

這篇博客主要是對“數(shù)據(jù)清洗”而言的集歇。數(shù)據(jù)清洗在自動化測試中有什么作用呢。做過接口自動化測試的都知道语淘,測試會造一些測試數(shù)據(jù)驗(yàn)證接口是否正常诲宇。這些測試數(shù)據(jù)最終會去到數(shù)據(jù)庫里。這就是我們所說的測試臟數(shù)據(jù)惶翻。為了保證這些臟數(shù)據(jù)不影響后面的測試姑蓝,在執(zhí)行自動化測試前先要把原有數(shù)據(jù)庫進(jìn)行數(shù)據(jù)備份,在測試完成后對數(shù)據(jù)庫恢復(fù)吕粗,這就做到了數(shù)據(jù)“隔離”纺荧、“備份”、“恢復(fù)”颅筋。測試數(shù)據(jù)不對原有的數(shù)據(jù)造成任何影響宙暇。不知道解釋清楚了沒有~~~

2、最終效果

測試前:數(shù)據(jù)庫備份
測試結(jié)束:數(shù)據(jù)還原

3议泵、安裝第三方庫
  pip install paramiko
4占贫、連接、操作Linux先口、
import paramiko


# 創(chuàng)建ssh客戶端
ssh_client = paramiko.SSHClient()

# 自動接受連接
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

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

# 方式二:用戶名+密鑰(未調(diào)試)
# ssh_client.connect(hostname='ip',port='端口',username='用戶名',password='密碼', pkey=paramiko.RSAKey.from_private_key_file('密鑰文件路徑'))

#操作Linux
"""
    stdin :執(zhí)行輸入     stdout:執(zhí)行結(jié)果     stderr:標(biāo)準(zhǔn)錯誤結(jié)果輸出
"""
stdin, stdout, stderr = ssh_client.exec_command('linux命令')

#默認(rèn)返回時<bytes>
#轉(zhuǎn)為字符串輸出
print(stdout.read().decode('utf-8'))

# 關(guān)閉連接
ssh_conn.close()

輸出結(jié)果是/root

5型奥、文件上傳、下載
# 創(chuàng)建連接
ssh_conn = paramiko.Transport('IP',22)

# 連接linux
ssh_conn.connect(username='用戶名',password='密碼')

# 創(chuàng)建sftp客戶端
sftp_client = paramiko.SFTPClient.from_transport(ssh_conn)

# 上傳 (localpath:本地路徑, remotepath:遠(yuǎn)程路徑)
# 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')

# 關(guān)閉連接
ssh_conn.close()

執(zhí)行后碉京,在在服務(wù)器/本地 下載/上傳文件

5厢汹、代碼封裝
class LinuxTools:
    # 初始化
    def __init__(self,host,port,username,password=None,private_key_file=None):
        """
        :param host: 服務(wù)器IP (str)
        :param port: 服務(wù)器端口 (int)
        :param username: 服務(wù)器登錄用戶名稱 (str)
        :param password: 服務(wù)器密碼 (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


        # 創(chuàng)建ssh客戶端
        ssh_client = paramiko.SSHClient()
        # 自動接受服務(wù)器發(fā)過來的密鑰
        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('連接失敗P持妗L淘帷!{}'.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())

    # 關(guān)閉連接
    def ssh_close(self):
        self.ssh_client.close()


class SFTPTools:
    """遠(yuǎn)程<-->本地厘灼,上傳夹纫、下載操作"""
    def __init__(self,host,port,username,password=None,private_key_file=None):
        """
        :param host: 服務(wù)器IP (str)
        :param port: 服務(wù)器端口 (int)
        :param username: 服務(wù)器登錄用戶名稱 (str)
        :param password: 服務(wù)器密碼 (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('連接已關(guān)閉')

補(bǔ)充:
數(shù)據(jù)庫備份:mysqldump -u root -p密碼 數(shù)據(jù)庫名稱 > 備份路徑.sql(備份文件.sql)
數(shù)據(jù)庫還原:mysql -u root -p密碼 數(shù)據(jù)庫名稱 < 備份路徑

數(shù)據(jù)清理大致思路:在測試前備份到本地文件夾 -->在上傳到服務(wù)器 -->測試執(zhí)行完畢 -->在服務(wù)器上執(zhí)行還原命令 月匣。
目前是這么個想法,具體代碼還木有開始寫~~

6奋姿、參考資料

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

創(chuàng)作不易锄开,點(diǎn)個贊,關(guān)注下唄~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末称诗,一起剝皮案震驚了整個濱河市萍悴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寓免,老刑警劉巖癣诱,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兢卵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來实抡,“玉大人,你說我怎么就攤上這事欢策∵赫” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵踩寇,是天一觀的道長鸟废。 經(jīng)常有香客問我,道長姑荷,這世上最難降的妖魔是什么盒延? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鼠冕,結(jié)果婚禮上添寺,老公的妹妹穿的比我還像新娘。我一直安慰自己懈费,他們只是感情好计露,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般票罐。 火紅的嫁衣襯著肌膚如雪叉趣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天该押,我揣著相機(jī)與錄音疗杉,去河邊找鬼。 笑死蚕礼,一個胖子當(dāng)著我的面吹牛烟具,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奠蹬,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼朝聋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了囤躁?” 一聲冷哼從身側(cè)響起冀痕,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狸演,沒想到半個月后言蛇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡严沥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了中姜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片消玄。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丢胚,靈堂內(nèi)的尸體忽然破棺而出翩瓜,到底是詐尸還是另有隱情,我是刑警寧澤携龟,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布兔跌,位于F島的核電站,受9級特大地震影響峡蟋,放射性物質(zhì)發(fā)生泄漏坟桅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一蕊蝗、第九天 我趴在偏房一處隱蔽的房頂上張望仅乓。 院中可真熱鬧,春花似錦蓬戚、人聲如沸夸楣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豫喧。三九已至石洗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間紧显,已是汗流浹背讲衫。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸟妙,地道東北人焦人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像重父,于是被迫代替她去往敵國和親花椭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容