Python運(yùn)維自動化之paramiko模塊應(yīng)用實例
運(yùn)維自動化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():
#定義一個變量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()這時會報錯,提示在服務(wù)器的known_hosts中沒有,這個就是連接服務(wù)器的時候那個首次連接需要輸入一個yes保存證書。

2.解決首次連接known_hosts問題
通過這個set_missing_host_key_policy方法用于實現(xiàn)登錄是需要確認(rèn)輸入yes,否則保存
#導(dǎo)入paramiko,(導(dǎo)入前需要先在環(huán)境里安裝該模塊)
import paramiko
#定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里
def sshExeCMD():
#定義一個變量ssh_clint
ssh_client=paramiko.SSHClient()
#通過這個set_missing_host_key_policy方法用于實現(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()連接成功, 沒有報錯:

3、執(zhí)行命令exec_command方法
使用exec_command執(zhí)行命令會返回三個信息:
1、標(biāo)準(zhǔn)輸入內(nèi)容(用于實現(xiàn)交互式命令)
2、標(biāo)準(zhǔn)輸出(保存命令的正常執(zhí)行結(jié)果)
3、標(biāo)準(zhǔn)錯誤輸出(保存命令的錯誤信息)
可以通過三個變量來接受,然后使用print輸出到屏幕查看
#導(dǎo)入paramiko,(導(dǎo)入前需要先在環(huán)境里安裝該模塊)
import paramiko
#定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里
def sshExeCMD():
#定義一個變量ssh_clint使用SSHClient類用來后邊調(diào)用
ssh_client=paramiko.SSHClient()
#通過這個set_missing_host_key_policy方法用于實現(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’的格式展示,如果后邊需要對回顯處理,可以直接用str把內(nèi)容輸出為字符串格式如下:
print(str(stdout.read()))
擴(kuò)展:
使用try異常捕獲
import paramiko
import sys
#定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里
def sshExeCMD():
#定義一個變量ssh_clint使用SSHClient類用來后邊調(diào)用
ssh_client=paramiko.SSHClient()
#通過這個set_missing_host_key_policy方法用于實現(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")
#如果上邊命令報錯吧報錯信息定義到err變量,并輸出。
except Exception as err:
print("服務(wù)器鏈接失敗?。。?)
print(err)
#如果報錯使用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、多臺服務(wù)器執(zhí)行命令
注意:給函數(shù)傳參,需要在函數(shù)括號里寫上接收的參數(shù)
#導(dǎo)入paramiko,(導(dǎo)入前需要先在環(huán)境里安裝該模塊)
import paramiko
import sys
#定義函數(shù)ssh,把操作內(nèi)容寫到函數(shù)里,函數(shù)里接收參數(shù)(寫在括號里),其中port=是設(shè)置一個默認(rèn)值如果沒傳就用默認(rèn)
def sshExeCMD(ip, username, password, port=22):
#定義一個變量ssh_clint使用SSHClient類用來后邊調(diào)用
ssh_client=paramiko.SSHClient()
#通過這個set_missing_host_key_policy方法用于實現(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)
#如果上邊命令報錯吧報錯信息定義到err變量,并輸出。
except Exception as err:
print("服務(wù)器鏈接失?。。?!"% ip)
print(err)
#如果報錯使用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__':
#定義一個字典,寫服務(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對應(yīng)值的字典,使用get獲取這個字典里對應(yīng)username鍵對應(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ù)器上傳下載文
時間: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(括號里寫上邊創(chuàng)建的Transport通道)基于上邊ssh連接創(chuàng)建一個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、多臺服務(wù)器上傳下載文件
和批量對服務(wù)器執(zhí)行命令原理一樣,使用字典寫服務(wù)器信息,通過for循環(huán)處理把變量分別傳給寫好的上傳函數(shù)。
'''
批量通過ssh協(xié)議在服務(wù)器上傳文件
時間: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é)尾)則添加一個,方便后邊拼接文件名
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__':
#定義一個字典,寫服務(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("請輸入源文件路徑(絕對路徑):")
remote_dir = input("服務(wù)器路徑(絕對路徑):")
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ò)展-文件操作
對文件的操作除了上傳下載還有其他很多操作

可擴(kuò)展練習(xí)
1、 輸入的文件是否存在
2、服務(wù)器目錄是否存在
3、上傳后文件是否完整(利用md5判斷,本地文件的md5和Linux命令md5sum)
總結(jié)
到此這篇關(guān)于Python運(yùn)維自動化之paramiko模塊應(yīng)用的文章就介紹到這了,更多相關(guān)Python自動化paramiko模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python利用paramiko實現(xiàn)基本的SSH客戶端操作
- Python使用Paramiko實現(xiàn)輕松判斷文件類型
- Python基于paramiko庫操作遠(yuǎn)程服務(wù)器的實現(xiàn)
- Python Paramiko創(chuàng)建文件目錄并上傳文件詳解
- python的paramiko模塊基本用法詳解
- Python中paramiko模塊的基礎(chǔ)操作與排錯問題
- Python遠(yuǎn)程SSH庫Paramiko詳細(xì)操作
- Python使用paramiko連接遠(yuǎn)程服務(wù)器執(zhí)行Shell命令的實現(xiàn)
- python運(yùn)維自動化Paramiko的實現(xiàn)示例
相關(guān)文章
python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式
這篇文章主要介紹了python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
這篇文章主要介紹了在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程,Debian系統(tǒng)和Nginx服務(wù)器皆是高性能的選擇,需要的朋友可以參考下2015-04-04
解決python3運(yùn)行selenium下HTMLTestRunner報錯的問題
今天小編就為大家分享一篇解決python3運(yùn)行selenium下HTMLTestRunner報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
Python中selenium實現(xiàn)文件上傳所有方法整理總結(jié)
本篇文章主要介紹了Python中selenium實現(xiàn)文件上傳所有方法整理總結(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
Python?pydash庫處理大規(guī)模數(shù)據(jù)集執(zhí)行復(fù)雜操作
在數(shù)據(jù)處理和分析領(lǐng)域,Python一直是一種強(qiáng)大的編程語言,然而,在處理大規(guī)模數(shù)據(jù)集和執(zhí)行復(fù)雜操作時,有時候需要更高效的工具,在本文中,我們將深入探討pydash庫,這是一個專注于提高Python代碼性能的工具2023-12-12
基于Python數(shù)據(jù)分析之pandas統(tǒng)計分析
這篇文章主要介紹了基于Python數(shù)據(jù)分析之pandas統(tǒng)計分析,具有很好對參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
如何將yolo格式轉(zhuǎn)化為voc格式:txt轉(zhuǎn)xml(親測有效)
這篇文章主要介紹了如何將yolo格式轉(zhuǎn)化為voc格式:txt轉(zhuǎn)xml,親測有效,可以使用,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友參考下吧2023-12-12

