詳解python之簡單主機(jī)批量管理工具
今天做了一個很簡單的小項(xiàng)目,感受到了paramiko模塊的強(qiáng)大,也深感自己Linux的功力不行~~
一、需求

二、簡單需求分析及流程圖
需求很少,我就簡單地說下:
1. 主機(jī)分組可以配置文件實(shí)現(xiàn)(我用字典存數(shù)據(jù)的).
2. 登陸功能不做。選擇分組后可查看組內(nèi)對應(yīng)主機(jī)的主機(jī)名和IP地址.
3. >>>cmd: df(輸入命令則起多個線程(視組內(nèi)有多少個主機(jī)而定)同時(shí)執(zhí)行)
輸出:
-------------h(huán)1------------
……(命令返回的數(shù)據(jù))
-------------h(huán)2------------
……
>>>put test.yy(本地文件) filename (把本地的test.yy文件傳到遠(yuǎn)程主機(jī)的/root目錄下)
4.可寫在配置文件中。包括遠(yuǎn)程主機(jī)的: 主機(jī)名 IP 用戶名 密碼 端口
流程圖

三、目錄結(jié)構(gòu)及源代碼
目錄結(jié)構(gòu):

from_windows.py(待上傳的文件)
main.py(批量主機(jī)管理接口)
"""批量主機(jī)管理接口""" import core if __name__ == "__main__": core.run()
core.py(核心代碼,被接口調(diào)用)
"""核心代碼"""
import settings
import paramiko
import threading
import os
class REMOTE_HOST(object):
#遠(yuǎn)程操作主機(jī)
def __init__(self, host, port ,username, password, cmd):
self.host = host
self.port = port
self.username = username
self.password = password
self.cmd = cmd
def run(self):
"""起線程連接遠(yuǎn)程主機(jī)后調(diào)用"""
cmd_str = self.cmd.split()[0]
if hasattr(self, cmd_str): #反射 eg:調(diào)用put方法
getattr(self, cmd_str)()
else:
#setattr(x,'y',v)is equivalent to ``x.y=v''
setattr(self, cmd_str, self.command)
getattr(self, cmd_str)() #調(diào)用command方法,執(zhí)行批量命令處理
def command(self):
"""批量命令處理"""
ssh = paramiko.SSHClient() #創(chuàng)建ssh對象
#允許連接不在know_hosts文件中的主機(jī)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password)
stdin,stdout,stderr = ssh.exec_command(self.cmd)
result = stdout.read()
print("%s".center(50, "-") % self.host)
print(result.decode())
ssh.close()
def put(self):
"""上傳文件"""
filename = self.cmd.split()[1] #要上傳的文件
transport = paramiko.Transport((self.host, self.port))
transport.connect(username=self.username, password=self.password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(filename, filename)
print("put sucesss")
transport.close()
def show_host_list():
"""通過選擇分組顯示主機(jī)名與IP"""
for index, key in enumerate(settings.msg_dic):
print(index + 1, key, len(settings.msg_dic[key]))
while True:
choose_host_list = input(">>>(eg:group1)").strip()
host_dic = settings.msg_dic.get(choose_host_list)
if host_dic:
#print(host_dic)
for key in host_dic:
print(key, host_dic[key]["IP"])
return host_dic
else:
print("NO exit this group!")
def interactive(choose_host_list):
"""根據(jù)選擇的分組主機(jī)起多個線程進(jìn)行批量交互"""
thread_list = []
while True:
cmd = input(">>>").strip()
if cmd:
for key in choose_host_list:
host, port, username, password = choose_host_list[key]["IP"], choose_host_list[key]["port"], \
choose_host_list[key]["username"], choose_host_list[key]["password"]
func = REMOTE_HOST(host, port, username, password, cmd) # 實(shí)例化類
t = threading.Thread(target=func.run) # 起線程
t.start()
thread_list.append(t)
for t in thread_list:
t.join() # 主線程等待子線程執(zhí)行完畢
else:
continue
def run():
choose_host_list = show_host_list()
interactive(choose_host_list)
settings.py(配置文件)
"""配置文件"""
msg_dic = {
"group1":{ #分組1
"h1":{"IP":"192.168.1.1", "username":"11", "password":"aa", "port":22},
"h2":{"IP":"192.168.1.2", "username":"22", "password":"bb", "port":22},
"h3":{"IP":"192.168.1.3", "username":"33", "password":"cc", "port":22},
"h4":{"IP":"192.168.1.4", "username":"44", "password":"dd", "port":22},
"h5":{"IP":"192.168.1.5", "username":"55", "password":"ee", "port":22},
"h6":{"IP":"192.168.1.6", "username":"66", "password":"ff", "port":22},
},
"group2":{ #分組2
"h1":{"IP":"192.168.2.1", "username":"111", "password":"aaa", "port":22},
"h2":{"IP":"192.168.2.2", "username":"222", "password":"bbb", "port":22},
"h3":{"IP":"192.168.2.3", "username":"333", "password":"ccc", "port":22},
"h4":{"IP":"192.168.2.4", "username":"444", "password":"ddd", "port":22},
"h5":{"IP":"192.168.2.5", "username":"555", "password":"eee", "port":22},
"h6":{"IP":"192.168.2.6", "username":"666", "password":"fff", "port":22},
"h7":{"IP":"192.168.2.7", "username":"777", "password":"ggg", "port":22},
"h8":{"IP":"192.168.2.8", "username":"888", "password":"hhh", "port":22},
},
"group3":{
"h1":{"IP":"192.168.179.133", "username":"root", "password":"zcl", "port":22},
}
}
測試:
硬件限制,我只用連接一臺虛擬機(jī)測試~
C:\Python34\python3.exe C:/Users/Administrator/PycharmProjects/laonanhai/host_manage/main.py 1 group1 6 2 group3 1 3 group2 8 >>>(eg:group1)group3 h1 192.168.179.133 >>>put from_windows.py put sucesss >>> >>>ls ------------------------192.168.179.133------------------------ anaconda-ks.cfg database_test from_windows.py install.log install.log.syslog m oot \root tmp\from_windows.py >>>
上傳前沒有from_windows.py文件,上傳后就有了!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
將pytorch的網(wǎng)絡(luò)等轉(zhuǎn)移到cuda
這篇文章主要介紹了將pytorch的網(wǎng)絡(luò)等轉(zhuǎn)移到cuda的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
matplotlib之多邊形選區(qū)(PolygonSelector)的使用
這篇文章主要介紹了matplotlib之多邊形選區(qū)(PolygonSelector)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
python的pytest框架之命令行參數(shù)詳解(上)
這篇文章主要介紹了python的pytest框架之命令行參數(shù)詳解,pytest是一款強(qiáng)大的python自動化測試工具,可以勝任各種類型或者級別的軟件測試工作。pytest提供了豐富的功能,包括assert重寫,第三方插件,需要的朋友可以參考下2019-06-06
一文詳解Python中PO模式的設(shè)計(jì)與實(shí)現(xiàn)
在使用 Python 進(jìn)行編碼的時(shí)候,會使用自身自帶的編碼設(shè)計(jì)格式,比如說最常見的單例模式等。本文將為大家介紹PageObject自動化設(shè)計(jì)模式(PO模式)的設(shè)計(jì)與實(shí)現(xiàn),感興趣的可以了解一下2022-06-06

