Python運(yùn)維自動(dòng)化之paramiko模塊應(yīng)用實(shí)例
運(yùn)維自動(dòng)化Python
paramiko模塊
一、模塊介紹
模塊:paramiko
模塊作用:
1、通過ssh協(xié)議遠(yuǎn)程執(zhí)行命令
2、文件上傳下載
安裝模塊:
pip install paramiko
二、模塊應(yīng)用
1.使用paramiko模塊,通過ssh協(xié)議連接服務(wù)器
#導(dǎo)入paramiko,(導(dǎo)入前需要先在環(huán)境里安裝該模塊) import paramiko #定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里 def sshExeCMD(): #定義一個(gè)變量ssh_clint ssh_client=paramiko.SSHClient() #使用cnnect類來連接服務(wù)器 ssh_client.connect(hostname="192.168.1.110", port="22", username="songxk", password="123123") #通過判斷模塊名運(yùn)行上邊函數(shù) if __name__ == '__main__': sshExeCMD()
這時(shí)會(huì)報(bào)錯(cuò),提示在服務(wù)器的known_hosts中沒有,這個(gè)就是連接服務(wù)器的時(shí)候那個(gè)首次連接需要輸入一個(gè)yes保存證書。
2.解決首次連接known_hosts問題
通過這個(gè)set_missing_host_key_policy方法用于實(shí)現(xiàn)登錄是需要確認(rèn)輸入yes,否則保存
#導(dǎo)入paramiko,(導(dǎo)入前需要先在環(huán)境里安裝該模塊) import paramiko #定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里 def sshExeCMD(): #定義一個(gè)變量ssh_clint ssh_client=paramiko.SSHClient() #通過這個(gè)set_missing_host_key_policy方法用于實(shí)現(xiàn)登錄是需要確認(rèn)輸入yes,否則保存 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #使用cnnect類來連接服務(wù)器 ssh_client.connect(hostname="192.168.1.110", port="22", username="songxk", password="123123") #通過判斷模塊名運(yùn)行上邊函數(shù) if __name__ == '__main__': sshExeCMD()
連接成功, 沒有報(bào)錯(cuò):
3、執(zhí)行命令exec_command方法
使用exec_command執(zhí)行命令會(huì)返回三個(gè)信息:
1、標(biāo)準(zhǔn)輸入內(nèi)容(用于實(shí)現(xiàn)交互式命令)
2、標(biāo)準(zhǔn)輸出(保存命令的正常執(zhí)行結(jié)果)
3、標(biāo)準(zhǔn)錯(cuò)誤輸出(保存命令的錯(cuò)誤信息)
可以通過三個(gè)變量來接受,然后使用print輸出到屏幕查看
#導(dǎo)入paramiko,(導(dǎo)入前需要先在環(huán)境里安裝該模塊) import paramiko #定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里 def sshExeCMD(): #定義一個(gè)變量ssh_clint使用SSHClient類用來后邊調(diào)用 ssh_client=paramiko.SSHClient() #通過這個(gè)set_missing_host_key_policy方法用于實(shí)現(xiàn)登錄是需要確認(rèn)輸入yes,否則保存 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #使用cnnect類來連接服務(wù)器 ssh_client.connect(hostname="192.168.1.110", port="22", username="songxk", password="123123") #使用exec_command方法執(zhí)行命令,并使用變量接收命令的返回值并用print輸出 stdin, stdout, stderr = ssh_client.exec_command("hostname") print(stdout.read()) #通過判斷模塊名運(yùn)行上邊函數(shù) if __name__ == '__main__': sshExeCMD()
展示內(nèi)容以python的格式b’內(nèi)容\n’的格式展示,如果后邊需要對(duì)回顯處理,可以直接用str把內(nèi)容輸出為字符串格式如下:
print(str(stdout.read()))
擴(kuò)展:
使用try異常捕獲
import paramiko import sys #定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里 def sshExeCMD(): #定義一個(gè)變量ssh_clint使用SSHClient類用來后邊調(diào)用 ssh_client=paramiko.SSHClient() #通過這個(gè)set_missing_host_key_policy方法用于實(shí)現(xiàn)登錄是需要確認(rèn)輸入yes,否則保存 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #使用try做異常捕獲 try: #使用cnnect類來連接服務(wù)器 ssh_client.connect(hostname="192.168.1.110", port="22", username="songx1k", password="123123") #如果上邊命令報(bào)錯(cuò)吧報(bào)錯(cuò)信息定義到err變量,并輸出。 except Exception as err: print("服務(wù)器鏈接失敗?。?!") print(err) #如果報(bào)錯(cuò)使用sys的exit退出腳本 sys.exit() #使用exec_command方法執(zhí)行命令,并使用變量接收命令的返回值并用print輸出 stdin, stdout, stderr = ssh_client.exec_command("df -hT") print(str(stdout.read())) #通過判斷模塊名運(yùn)行上邊函數(shù) if __name__ == '__main__': sshExeCMD()
4、多臺(tái)服務(wù)器執(zhí)行命令
注意:給函數(shù)傳參,需要在函數(shù)括號(hào)里寫上接收的參數(shù)
#導(dǎo)入paramiko,(導(dǎo)入前需要先在環(huán)境里安裝該模塊) import paramiko import sys #定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里,函數(shù)里接收參數(shù)(寫在括號(hào)里),其中port=是設(shè)置一個(gè)默認(rèn)值如果沒傳就用默認(rèn) def sshExeCMD(ip, username, password, port=22): #定義一個(gè)變量ssh_clint使用SSHClient類用來后邊調(diào)用 ssh_client=paramiko.SSHClient() #通過這個(gè)set_missing_host_key_policy方法用于實(shí)現(xiàn)登錄是需要確認(rèn)輸入yes,否則保存 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #使用try做異常捕獲 try: #使用cnnect類來連接服務(wù)器 ssh_client.connect(hostname=ip, port=port, username=username, password=password) #如果上邊命令報(bào)錯(cuò)吧報(bào)錯(cuò)信息定義到err變量,并輸出。 except Exception as err: print("服務(wù)器鏈接失?。。?!"% ip) print(err) #如果報(bào)錯(cuò)使用sys的exit退出腳本 sys.exit() #使用exec_command方法執(zhí)行命令,并使用變量接收命令的返回值并用print輸出 #這里也可以把命令做成參數(shù)傳進(jìn)來 stdin, stdout, stderr = ssh_client.exec_command("hostname") #使用decode方法可以指定編碼 print(stdout.read().decode("utf-8")) #通過判斷模塊名運(yùn)行上邊函數(shù) if __name__ == '__main__': #定義一個(gè)字典,寫服務(wù)器信息 servers = { #以服務(wù)器IP為鍵,值為服務(wù)器的用戶密碼端口定義的字典 "192.168.1.110": { "username": "songxk", "password": "123123", "port": 22, }, "192.168.1.123": { "username": "root", "password": "123123", "port": 22, }, } #使用items方法遍歷,使用ip 和info把字典里的鍵和值遍歷賦值,傳給函數(shù)sshExeCMD for ip, info in servers.items(): # 這里的info也就是上邊定義的ip對(duì)應(yīng)值的字典,使用get獲取這個(gè)字典里對(duì)應(yīng)username鍵對(duì)應(yīng)的值,賦值給變量username傳給函數(shù)中使用 sshExeCMD( ip=ip, username=info.get("username"), password=info.get("password"), port=info.get("port") )
5、從服務(wù)器上傳下載文件–SFTPClient方法
''' 通過ssh協(xié)議在服務(wù)器上傳下載文 時(shí)間:2022-04-09 ''' import paramiko def sshfileftp(): #與服務(wù)器創(chuàng)建ssh連接,transport方法建立通道,以元組的方式歇服務(wù)器信息 ssh_conn = paramiko.Transport(("192.168.1.110", 60317)) ssh_conn.connect(username="songxk", password="123123") #創(chuàng)建連接后,使用sftpclient類和from_transport(括號(hào)里寫上邊創(chuàng)建的Transport通道)基于上邊ssh連接創(chuàng)建一個(gè)sftp連接,定義成ftp_client變量后邊方便引用 ftp_client = paramiko.SFTPClient.from_transport(ssh_conn) #下載文件 #ftp_client.get("目標(biāo)文件", r"保存位置,寫到文件名") ftp_client.get("/etc/fstab", r"C:\Users\Administrator.USER-CH3G0KO3MG\Desktop\test\fstab") ''' 上傳文件 ftp_client.put(r"C:\Users\Administrator.USER-CH3G0KO3MG\Desktop\test\fstab", "/etc/fstab") ''' #關(guān)閉ssh連接 ssh_conn.close() if __name__ == '__main__': sshfileftp()
6、多臺(tái)服務(wù)器上傳下載文件
和批量對(duì)服務(wù)器執(zhí)行命令原理一樣,使用字典寫服務(wù)器信息,通過for循環(huán)處理把變量分別傳給寫好的上傳函數(shù)。
''' 批量通過ssh協(xié)議在服務(wù)器上傳文件 時(shí)間:2022-04-09 localfile:本地文件名 remotedir:服務(wù)器目錄名 ''' import paramiko #后續(xù)需要用到os模塊的方法 import os #定義函數(shù)并且接收變量 def sshPutfile(ip, port, username, password, localfile, remotedir): #獲取源文件的文件名,把進(jìn)來的localfile變量的值處理只剩文件名 file_name = os.path.basename(localfile) #處理服務(wù)器目錄名,如果輸入的目錄名沒有帶后邊的/(不是以/結(jié)尾)則添加一個(gè),方便后邊拼接文件名 if not remotedir.endswith("/"): remotedir = remotedir + "/" dest_file_name = remotedir + file_name #創(chuàng)建ssh連接 ssh_conn = paramiko.Transport((ip, port)) ssh_conn.connect(username=username, password=password) #創(chuàng)建ftp工具(變量) ftp_client = paramiko.SFTPClient.from_transport(ssh_conn) #上傳文件 ftp_client.put(localfile, dest_file_name) # 關(guān)閉ssh連接 ssh_conn.close() if __name__ == '__main__': #定義一個(gè)字典,寫服務(wù)器的信息 servers = { #以服務(wù)器IP為鍵,值為服務(wù)器的用戶密碼端口定義的字典 "192.168.1.110": { "username": "songxk", "password": "123123", "port": 60317, }, "192.168.106.71": { "username": "root", "password": "123123", "port": 22, }, } source_file = input("請(qǐng)輸入源文件路徑(絕對(duì)路徑):") remote_dir = input("服務(wù)器路徑(絕對(duì)路徑):") for ip, info in servers.items(): sshPutfile( ip=ip, port=info.get("port"), username=info.get("username"), password=info.get("password"), localfile=source_file, remotedir=remote_dir )
效果:
擴(kuò)展-文件操作
對(duì)文件的操作除了上傳下載還有其他很多操作
可擴(kuò)展練習(xí)
1、 輸入的文件是否存在
2、服務(wù)器目錄是否存在
3、上傳后文件是否完整(利用md5判斷,本地文件的md5和Linux命令md5sum)
總結(jié)
到此這篇關(guān)于Python運(yùn)維自動(dòng)化之paramiko模塊應(yīng)用的文章就介紹到這了,更多相關(guān)Python自動(dòng)化paramiko模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python使用Paramiko庫實(shí)現(xiàn)SSH管理詳解
- python的paramiko模塊基本用法詳解
- Python通過paramiko庫實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法
- Python中paramiko模塊的基礎(chǔ)操作與排錯(cuò)問題
- Python遠(yuǎn)程SSH庫Paramiko詳細(xì)操作
- python 第三方庫paramiko的常用方式
- Python如何實(shí)現(xiàn)Paramiko的二次封裝
- python 使用paramiko模塊進(jìn)行封裝,遠(yuǎn)程操作linux主機(jī)的示例代碼
- Python paramiko使用方法代碼匯總
- Python Paramiko模塊中exec_command()和invoke_shell()兩種操作區(qū)別
相關(guān)文章
python 給DataFrame增加index行名和columns列名的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 給DataFrame增加index行名和columns列名的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06python3實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11使用Python腳本來控制Windows Azure的簡單教程
這篇文章主要介紹了使用Python腳本來控制Windows Azure的簡單教程,由于微軟官方提供了Python SDK,使得用戶自己用Python控制Azure成為了可能,需要的朋友可以參考下2015-04-04Python PIL庫Image函數(shù)的基本圖像處理操作實(shí)例
這篇文章主要為大家介紹了Python PIL庫Image函數(shù)的基本圖像處理操作實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01python中shapefile庫讀取shapefile文件信息
本文主要介紹了python中shapefile庫讀取shapefile文件信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Datawhale練習(xí)之二手車價(jià)格預(yù)測(cè)
此篇文章是關(guān)于Datawhale練習(xí),代碼完整,但由于該數(shù)據(jù)集中數(shù)據(jù)特征較少(39維),以下可作為少量特征情況下的分析。當(dāng)特征數(shù)目過大(成千上萬)時(shí),需要繼續(xù)學(xué)習(xí)。需要的朋友可以參考下2021-04-04使用Python讀取和修改Excel文件(基于xlrd、xlwt和openpyxl模塊)
本文介紹一下使用Python對(duì)Excel文件的基本操作,包括使用xlrd模塊讀取excel文件,使用xlwt模塊將數(shù)據(jù)寫入excel文件,使用openpyxl模塊讀取寫入和修改excel文件,需要的朋友可以參考下2021-11-11PyTorch線性回歸和邏輯回歸實(shí)戰(zhàn)示例
這篇文章主要介紹了PyTorch線性回歸和邏輯回歸實(shí)戰(zhàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05