热心冰块
作者热心冰块·2022-01-27 18:35
项目经理·浪潮INSPUR

Python3的SSH模块Paramiko用法4——多进程执行

字数 3426阅读 2104评论 1赞 1

今天添加了从文件读取命令集,多进程执行并打印结果到屏幕,如果需要讲结果写入文件,可自行修改第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 条评论

热心冰块热心冰块项目经理浪潮INSPUR
2022-02-03 12:39
预告一下:最近在整理学习一个发送、侦听和解析并伪装网络报文的库——Scapy,不过我可能用不了那么多的功能,会用到ICMP和端口扫描。

热心冰块@近水楼台 写好了,你去看吧

2022-03-31 20:06

近水楼台@热心冰块 可以给个注释么 初学者看不懂

2022-02-22 13:11
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广