【问题标题】:Executing SSH command over list of IP addresses (using Paramiko)通过 IP 地址列表执行 SSH 命令(使用 Paramiko)
【发布时间】:2018-01-23 15:54:51
【问题描述】:

第一次发帖,因为我对 Python 非常陌生,但我遇到了一个需要帮助的问题 - 如果我的代码看起来有点简陋,请原谅我。

使用 Paramiko,我构建了一个用于商业用途的自定义 SSH 客户端 - 最终的游戏是让它通过 IP 地址列表(从文本文件解析)执行给定命令(作为示例重新启动)序列。

对于 Paramiko 部分:

import paramiko
import sys
import os
import time

port = 22

def ssh_comm(ip, user, password, cmd):
     try:
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(ip, username='username', password='password')
        ssh_session = client.get_transport().open_session()
        if ssh_session.active:
           ssh_session.exec_command(cmd),
           buffer = (ssh_session.recv(4096)).decode("utf-8")
           print (buffer)
     except paramiko.AuthenticationException:
        ssh_comm2(ip, user, password, cmd) **#TRIES NEXT SET OF CREDENTIALS**

def cmd_loop_ssh():
        while True:
                cmd = input('Command: ')
                ssh_comm(ip, user, password, cmd)

ip = input('IP: ')
cmd_loop_ssh()

这适用于在一台机器上执行命令,但我需要它在多个机器上执行 - 我可以从格式化的文本文件中解析我需要的 IP,如下所示:

iplist = '\IP TEXT FILE LOCATION.txt\'
    with open(iplist, 'r') as fp:
        line = fp.readline()
        while line:
            print ('{}'.format(line.strip()))
            line = fp.readline()

再次,非常对此很陌生 - 任何帮助将不胜感激!

【问题讨论】:

    标签: python list ssh paramiko text-parsing


    【解决方案1】:

    首先,您可以像这样更清晰地读取您的 IP 地址文件:

    with open(iplist) as fp:
        ips = [line.strip() for line in fp]
    

    那么我认为您需要做的就是将该块放入您的cmd_loop_ssh 中,在while 循环之前,然后替换

    ssh_comm(ip, user, password, cmd)
    

    for ip in ips:
        ssh_comm(ip, user, password, cmd)
    

    您可能还想添加一个退出命令:

    cmd = input('Command: ')
    if cmd == 'quit':
        break
    else:
        for ip in ips:
            ssh_comm(ip, user, password, cmd)
    

    【讨论】:

    • 这可行,但它不会按顺序选择 IP。它只是从文本文件中随机选择地址。在文本文件中的 3 个地址中,它只是在其中 2 个地址之间弹跳,从不尝试第 3 个。
    • 啊,我误解了你的要求:如果第一个IP失败,你只想继续第二个IP?
    • 不,我想我不明白你在追求什么。我建议您添加更多日志记录(只是简单的打印语句)。 for 循环肯定只会按照它们在文件中存在的顺序遍历这些行。
    • 那么一定是由于某种原因失败了,我没有收到反馈 - 谢谢,我会进一步调查并在获得更多信息时返回。