ssh到多个交换机的Python脚本发送命令输出

时间:2018-06-27 07:27:57

标签: python

是python的新手。我可以使用以下脚本来切换到交换机并获取所需的数据,但我需要从100多个交换机中提取此信息。为此,我需要添加什么内容?谢谢

from paramiko import client

class ssh:

    client = None

    def __init__(self, address, username, password):
        # Let the user know we're connecting to the server
        print("Connecting to switch.")
        # Create a new SSH client
        self.client = client.SSHClient()
        # The following line is required if you want the script to be able to access a server that's not yet in the known_hosts file
        self.client.set_missing_host_key_policy(client.AutoAddPolicy())
        # Make the connection
        self.client.connect(address, username=username, password=password, look_for_keys=False)


    def sendCommand(self, command):
        if(self.client):
            stdin, stdout, stderr = self.client.exec_command(command)
            while not stdout.channel.exit_status_ready():
                # Print data when available
                if stdout.channel.recv_ready():
                    alldata = stdout.channel.recv(1024)
                    prevdata = b"1"
                    while prevdata:
                        prevdata = stdout.channel.recv(1024)
                        alldata += prevdata

                    print(str(alldata, "utf8"))
        else:
            print("Connection not opened.")

connection = ssh("x.x.x.x", "user", "pwd")
connection.sendCommand("show int status | e not")

3 个答案:

答案 0 :(得分:0)

三明治意味着实例?所以你想在多机上运行命令?您可以尝试面料。

@roles("instance-group")
@task
def upload():
    """上传代码到测试服务器"""
    local("tar -zc -f /tmp/btbu-spider.tar.gz ../BTBU-Spider")
    put("/tmp/btbu-spider.tar.gz", "/tmp/")
    local('rm /tmp/btbu-spider.tar.gz')
    run("tar -zx -f /tmp/btbu-spider.tar.gz -C ~/test/")

然后您可以定义“ instance-group” ssh ip,可以从本地调用此函数。但是实际上所有这些命令都是在远程实例(不是本地函数)上运行的。

答案 1 :(得分:0)

将有关所有交换机的信息添加到配置文件中,例如:

地址1,用户名1,密码1

地址2,用户名2,密码2

每个开关都可以换行,并且可以使用逗号分隔参数以简化使用。然后,打开文件并逐行读取并解析它们:

with open('switches.conf', 'r') as f:
    for line in f: # Read line by line
        params = line.split(',') # Split the three arguments by comma
        address = params[0]
        username = params[1]
        password = params[2]
        connection = ssh(address, username, password)
        connection.sendCommand("show int status | e not")
        with open(address, 'w+') as wf: # If you have to write any information about the switches, suggesting this method
            wf.write(..information to write..)

必须在循环中完成。您可以仅在该周期中调用两个函数,即初始化SSH连接的函数和获取信息的函数,而这可能是您的主要功能。当然,配置示例只是一个准则,它有很多缺陷,尤其是安全缺陷,因此您可以根据需要进行配置。无论如何,这个想法是,您只需要一个周期就可以做到这一点,并且通过读取配置文件可以使它变得容易得多:)并且您可以将信息保存到以实例地址命名的不同文本文件中。例如,@ Santosh Kumar在评论中建议。 编辑:编辑我的答案,并为连接和发送命令添加了一个示例,因为我没有注意到这是一个类。

答案 2 :(得分:0)

您可以使用parallel-ssh在多台计算机上运行ssh cmds。通过运行`pip install parallel-ssh

来获取它
from pssh.clients import ParallelSSHClient

hosts = ['switch1', 'switch2']
client = ParallelSSHClient(hosts, user='my_user', password='my_pass')

output = client.run_command('show int status | e not')
for host, host_output in output.items():
    print host, "".join(host_output.stdout)