如何在python中使用netmiko在多个cisco设备上执行ssh



我正在尝试为多个设备运行下面的脚本,根据下面的脚本它只适用于最后一个设备。

请验证以下脚本,因为我需要使用for循环语句执行两个设备输出。

from netmiko import ConnectHandler 
from getpass import getpass
password= getpass()
RTR_01 = {
'device_type': 'cisco_ios',
'host': '10.10.10.10',
'username': 'admin',
'password': password,
}
RTR_02 = { 'device_type': 'cisco_ios', 
'host': '10.10.10.11', 
'username': 'admin', 
'password': password, }
device_list = [RTR_01,RTR_02] 
for device in device_list: print('Connecting to the device :' + device ['host']) 
net_connect = ConnectHandler(**device)
output = net_connect.send_command('show ip interface brief')
print(output)
output = net_connect.send_command('show version')
print(output)

我现在知道它是如何100%正确工作的。我尝试过使用适当缩进的net_connect.disconnect(),但没有成功,因为一旦您退出循环的缩进,它就会自动退出。问题是,尽管很愚蠢,但我仍然连接到实际的设备,并且收到了一个错误,我忽略了这个错误,抱怨无法创建/var/home/myusername/.ssh

我所需要做的就是在循环的最后发出以下命令:

net_connect.write_channel('exitn')

这样愚蠢的错误和浪费了这么多时间,但这一课很有价值!也许它可以帮助这里的其他人。

您需要在for循环中缩进这些行

net_connect = ConnectHandler(**device)
output = net_connect.send_command('show ip interface brief')
print(output)
output = net_connect.send_command('show version')
print(output)

你的代码应该是这样的:

from getpass import getpass
from netmiko import ConnectHandler
password = getpass()
RTR_01 = {
"device_type": "cisco_ios",
"host": "10.10.10.10",
"username": "admin",
"password": password,
}
RTR_02 = {
"device_type": "cisco_ios",
"host": "10.10.10.11",
"username": "admin",
"password": password,
}
device_list = [RTR_01, RTR_02]
for device in device_list:
print("Connecting to the device :" + device["host"])
net_connect = ConnectHandler(**device)
output = net_connect.send_command("show ip interface brief")
print(output)
output = net_connect.send_command("show version")
print(output)
net_connect.disconnect() # to clear the vty line when done

这是一个更好的代码版本,可以做同样的事情:

from getpass import getpass
from netmiko import ConnectHandler
password = getpass()
ipaddrs = ["10.10.10.10", "10.10.10.11"]
# A list comprehension
devices = [
{
"device_type": "cisco_ios",
"host": ip,
"username": "admin",
"password": password,
}
for ip in ipaddrs
]
for device in devices:
print(f'Connecting to the device: {device["host"]}')
with ConnectHandler(**device) as net_connect:  # Using Context Manager
intf_brief = net_connect.send_command(
"show ip interface brief"
)  # Inside the connection
facts = net_connect.send_command("show version")  # Inside the connection
# Notice here I didn't call the `net_connect.disconnect()`
# because the `with` statement automatically disconnects the session.
# On this indentation level (4 spaces), the connection is terminated
print(intf_brief)
print(facts)

输出(intf_brieffacts(在连接之外打印,因为不再需要会话来打印任何收集的值。

最新更新