将 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_ip
、ms_key
和 rm_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
永远不会改变)
我目前正在使用 paramiko 模块通过 SSH 进入以 .csv 文件形式提供的 IP 地址列表,然后将命令推送到这些 IP。为此,我使用 csv.reader() 打开并读取以下格式的文件的 100 行。
序列号、IP地址、MS、RM(MS&RM是与IP地址相关的信息)
背景
这是我使用 csv.reader() 打开和读取文件然后将信息作为字典放置的地方 keys
。
然后我在 keys
中嵌套另一个字典作为 keys[row[0]]
以索引 IP 地址和其他信息作为 ep_ip
、ms_key
和 rm_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
永远不会改变)