将 Paramiko SSH 模块与 csv.reader 一起使用?

Using Paramiko SSH module with csv.reader?

我目前正在使用 paramiko 模块通过 SSH 进入以 .csv 文件形式提供的 IP 地址列表,然后将命令推送到这些 IP。为此,我使用 csv.reader() 打开并读取以下格式的文件的 100 行。

序列号、IP地址、MS、RM(MS&RM是与IP地址相关的信息)

背景

这是我使用 csv.reader() 打开和读取文件然后将信息作为字典放置的地方 keys

然后我在 keys 中嵌套另一个字典作为 keys[row[0]] 以索引 IP 地址和其他信息作为 ep_ipms_keyrm_key.

option_dict = open('OptionKeyDict.csv','r')
reader= csv.reader(option_dict)

keys= {}

for row in reader:
    keys[row[0]]= {'IP':row[1],'MS': row[2],'RM': row[3]}

ep_ip = keys[row[0]]['IP']
ms_key= keys[row[0]]['MS']
rm_key= keys[row[0]]['RM']

command= 'xCommand SystemUnit OptionKey Add Key: '

multi_site= command + ms_key
remote_monitor= command + rm_key

然后我继续介绍脚本的Paramiko逻辑,将上面的语句和SSH到IP地址,然后执行multi-site & remote-monitor命令。

for host in keys:
    host= ep_ip
    i = 1

    while True:
        print ("\nTrying to connect to %s (%i/2)" % (host, i))

        try:
           ssh = paramiko.SSHClient()
           ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
           ssh.connect(host, username=username, password=password, look_for_keys=False, timeout= 5)
           print ("\nConnected to %s" % host )
           connection_state = 1
           break

    if connection_state == 1:
        client_shell = ssh.invoke_shell()
        time.sleep(.4)
        client_shell.send(multi_site + "\n")
        time.sleep(.4)
        client_shell.send(remote_monitor + "\n")

因此,运行 这部分有效。脚本成功通过 SSH 推送命令,但它仅使用最后一行的信息(IP 地址、MS 和 RM)并运行 100 次,因为 .csv 中有 100 行。

我似乎无法让脚本从第一行开始,然后逐行执行到第 100 行。

现在我已经了解了上下文......(抱歉,Whosebug 的新手)

问题

我在这里缺少什么可以使这一切发生?我觉得这是一个我没有看到的简单调整。

我们将不胜感激任何和所有的反馈。 谢谢!

您根本没有在 for host in keys: 循环中使用 host 变量。

而且您实际上可以在直接阅读数据时使用这些数据。看起来您根本不需要将数据收集到 keys

for row in reader:
    host = row[1]
    ms_key = row[2]
    rm_key = row[3]

    i = 1

    while True:
        print ("\nTrying to connect to %s (%i/2)" % (host, i))

        try:
           ssh = paramiko.SSHClient()
           ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
           ssh.connect(
               host, username=username, password=password, look_for_keys=False, timeout= 5)
           print ("\nConnected to %s" % host )
           connection_state = 1
           break

    if connection_state == 1:
        client_shell = ssh.invoke_shell()
        time.sleep(.4)
        client_shell.send(multi_site + "\n")
        time.sleep(.4)
        client_shell.send(remote_monitor + "\n")

(顺便说一句,i 的初始值 1 永远不会改变)