今天添加了从文件读取命令集,多进程执行并打印结果到屏幕,如果需要讲结果写入文件,可自行修改第97行,添加写入文件的相关语句即可。
具体代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import paramiko.util
import multiprocessing
class SSHTransport(object):
def __init__(self, host, port, username, password):
self._host = host
self._port = port
self._username = username
self._password = password
self._transport = None
self._sftp = None
self._client = None
self._connect()
def _connect(self):
paramiko.util.log_to_file("D:\\SSH_Connect.log")
transport = paramiko.Transport((self._host, self._port))
transport.connect(username=self._username, password=self._password)
self._transport = transport
def download(self, remotepath, localpath):
if self._sftp is None:
self._sftp = paramiko.SFTPClient.from_transport(self._transport)
self._sftp.get(remotepath, localpath)
def upload(self, localpath, remotepath):
if self._sftp is None:
self._sftp = paramiko.SFTPClient.from_transport(self._transport)
self._sftp.put(localpath, remotepath)
def exec_command(self, command):
if self._client is None:
self._client = paramiko.SSHClient()
self._client._transport = self._transport
stdin, stdout, stderr = self._client.exec_command(command)
re = list()
for Line in stdout.readlines():
re.append(Line[:-1])
return re
def close(self):
if self._transport:
self._transport.close()
if self._client:
self._client.close()
def login_info(file_name):
login_info = list()
host_info = list()
with open(file_name, "r")as f:
for Line in f.read().splitlines():
match len(host_info):
case 0:
host_info.append(Line)
case 1:
host_info.append(int(Line))
case 2:
host_info.append(Line)
case 3:
host_info.append(Line)
login_info.append(host_info)
host_info = list()
return login_info
def comm_info(file_name):
comm_info = list()
with open(file_name, "r")as f:
for Line in f.read().splitlines():
comm_info.append(Line)
return comm_info
class mp_start(object):
def __init__(self, hosts_info):
conn = SSHTransport(hosts_info[0], hosts_info[1], hosts_info[2], hosts_info[3])
re = list()
re.append("IP Address is: " + hosts_info[0])
for comm in hosts_info[4]:
re.append("---=== Command is: " + comm)
for Line in conn.exec_command(comm):
re.append(Line)
conn.close()
re.append("")
for Line in re:
print(Line)
if __name__ == "__main__":
hosts_info = list()
comms_info = list()
for Line in comm_info("Command.ini"):
comms_info.append(Line)
for Line in login_info("LoginInfo.ini"):
hosts_info.append([Line[0], Line[1], Line[2], Line[3], comms_info])
with multiprocessing.Pool() as p:
print(p.map(mp_start, hosts_info))
用于存储命令集的文件Command.ini格式是一条命令一行,自行创建即可。
越写越长了,如果看不懂或者需要注释的单独找我要把,没人要我就不写了,真的是太懒了我,哈哈
至此,Paramiko系列基本就结束了,写的比较粗糙哈,就简单的run了一下出结果就ok了,没做特别详细的功能性和稳定性等测试。另外,如果还有其他需要添加的功能的想法可以留言一起讨论哈。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论1 条评论
2022-02-03 12:39
热心冰块: @近水楼台 写好了,你去看吧
近水楼台: @热心冰块 可以给个注释么 初学者看不懂