I did a very simple small project today. I felt the power of the paramiko module, and I also felt that my Linux skills were not good~~
There are very few requirements, so I will simply say:
1. HostGroup can be configured fileimplemented (I use a dictionary to store data ).
2. The login function does not work. After selecting a group, you can view the host name and IP address of the corresponding host in the group. Depends on the host) Executed simultaneously)
Output:
-------------h1--------- ---
…(data returned by the command)
by thereby -----
……
>>>put test.yy (local file) file
name (put local The test.yy file is transferred to the /root directory of the remote host) 4. It can be written in the configuration file. Including the remote host: Host name IP User name Password Port
3.
Directory structure
##from_windows.py(to be
uploaded main.py(Batch Host ManagementInterface)"""批量主机管理接口"""
import core
if name == "main":
core.run()
"""核心代码"""
import settings
import paramiko
import threading
import os
class REMOTE_HOST(object):
#远程操作主机
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):
"""起线程连接远程主机后调用"""
cmd_str = self.cmd.split()[0]
if hasattr(self, cmd_str): #反射 eg:调用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)() #调用command方法,执行批量命令处理
def command(self):
"""批量命令处理"""
ssh = paramiko.SSHClient() #创建ssh对象
#允许连接不在know_hosts文件中的主机
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():
"""通过选择分组显示主机名与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):
"""根据选择的分组主机起多个线程进行批量交互"""
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) # 实例化类
t = threading.Thread(target=func.run) # 起线程
t.start()
thread_list.append(t)
for t in thread_list:
t.join() # 主线程等待子线程执行完毕
else:
continue
def run():
choose_host_list = show_host_list()
interactive(choose_host_list)
"""配置文件"""
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},
}
}
Test:
Hardware limitations, I only need to connect to one virtual machine for testing~
C:\Python34\python3.exe C:/Users/Administrator/PycharmProjects/laonanhai/host_manage/main.py1 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>>>
Before uploading There is no from_windows.py file, but there will be after uploading!
The above is the detailed content of Detailed graphic explanation of Python's simple host batch management tool. For more information, please follow other related articles on the PHP Chinese website!