Python |婚礼
Python | Netmiko
我正在 Python 中使用 Netmiko 编写脚本来自动升级 450 多个路由器。它们是 881/887、1921 和 2901 的混合。
我正在使用 Netmiko 并研究了如何确定型号并复制适当的 IOS 版本。我遇到的问题是重新加载路由器。我正在尝试使用 send_command_expect
函数,但我无法让它工作。
这是我试图实现它的方法。感谢任何帮助。
import getpass
import time
from netmiko import ConnectHandler, file_transfer
host = "10.0.0.1"
u = "cisco"
p = "cisco"
source_file = "c800-universalk9-mz.SPA.155-3.M5.bin"
router = {
'device_type': "cisco_ios",
'ip': host,
'username': u,
'password': p,
}
try:
ssh_conn = ConnectHandler(**router)
print ("Connection successful\n")
except:
print ("Login failure\n")
sys.exit()
output = ssh_conn.send_command_expect('write mem')
output += ssh_conn.send_command('reload')
output += ssh_conn.send_command('\n')enter code here
错误信息如下:
192-168-1-6:CiscoUpgrade sudarshanv$ python3 test.py
Connection successful
Traceback (most recent call last):
File "test.py", line 25, in <module>
output += ssh_conn.send_command('reload')
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/netmiko/base_connection.py", line 1112, in send_command
search_pattern))
OSError: Search pattern never detected in send_command_expect: HomeRTR\#
192-168-1-6:CiscoUpgrade sudarshanv$
我想出来了,为了大家好,把解决方案贴在这里。
解决方案是使用 send_command_timing 函数而不是 send_command.
问题是 .send_command()
等待预期的字符串停止。由于您使用 'device_type': "cisco_ios"
,因此预期的字符串是“#”。
当您发送命令 'reload' 时,'#' 永远不会出现,这就是您收到此错误的原因。您还可以使用如下发送命令:
.send_command('your command', expect_string = '[#\?$]')
这样你就可以改变例外的字符串来完成这个功能。您还可以在 expect_string
.
中使用正则表达式
我最近一直在玩这个,这是我的 2 美分。祝你们好运!
第 1 步:创建连接处理程序
import netmiko
connection = netmiko.ConnectHandler(ip="192.168.30.161", device_type='cisco_ios', username='cisco', password='cisco123')
第 2 步:检查连接
connection
第 3 步:对于 Cisco 路由器和交换机,您期待expect_string='[确认]'
connection.send_command('reload', expect_string='[confirm]')
'Proceed with reload? [confirm]'
connection.send_command('\n')
或
connection.send_command('y')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.8/dist-packages/netmiko/utilities.py", line 347, in wrapper_decorator
return func(self, *args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 1368, in send_command
prompt = self.find_prompt(delay_factor=delay_factor)
File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 1107, in find_prompt
self.write_channel(self.RETURN)
File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 436, in write_channel
self._write_channel(out_data)
File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 394, in _write_channel
self.remote_conn.sendall(write_bytes(out_data, encoding=self.encoding))
File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 846, in sendall
sent = self.send(s)
File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 801, in send
return self._send(s, m)
File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 1198, in _send
raise socket.error("Socket is closed")
OSError: Socket is closed
结果:
您的 Cisco 路由器或交换机应该重新加载。
*4 月 14 日 08:06:18.842:%SYS-5-RELOAD:思科在 vty0 (192.168.30.181) 上请求重新加载。重新加载原因:重新加载命令。
*4 月 14 日 08:06:21.873
请求重新加载
我正在 Python 中使用 Netmiko 编写脚本来自动升级 450 多个路由器。它们是 881/887、1921 和 2901 的混合。
我正在使用 Netmiko 并研究了如何确定型号并复制适当的 IOS 版本。我遇到的问题是重新加载路由器。我正在尝试使用 send_command_expect
函数,但我无法让它工作。
这是我试图实现它的方法。感谢任何帮助。
import getpass
import time
from netmiko import ConnectHandler, file_transfer
host = "10.0.0.1"
u = "cisco"
p = "cisco"
source_file = "c800-universalk9-mz.SPA.155-3.M5.bin"
router = {
'device_type': "cisco_ios",
'ip': host,
'username': u,
'password': p,
}
try:
ssh_conn = ConnectHandler(**router)
print ("Connection successful\n")
except:
print ("Login failure\n")
sys.exit()
output = ssh_conn.send_command_expect('write mem')
output += ssh_conn.send_command('reload')
output += ssh_conn.send_command('\n')enter code here
错误信息如下:
192-168-1-6:CiscoUpgrade sudarshanv$ python3 test.py
Connection successful
Traceback (most recent call last):
File "test.py", line 25, in <module>
output += ssh_conn.send_command('reload')
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/netmiko/base_connection.py", line 1112, in send_command
search_pattern))
OSError: Search pattern never detected in send_command_expect: HomeRTR\#
192-168-1-6:CiscoUpgrade sudarshanv$
我想出来了,为了大家好,把解决方案贴在这里。 解决方案是使用 send_command_timing 函数而不是 send_command.
问题是 .send_command()
等待预期的字符串停止。由于您使用 'device_type': "cisco_ios"
,因此预期的字符串是“#”。
当您发送命令 'reload' 时,'#' 永远不会出现,这就是您收到此错误的原因。您还可以使用如下发送命令:
.send_command('your command', expect_string = '[#\?$]')
这样你就可以改变例外的字符串来完成这个功能。您还可以在 expect_string
.
我最近一直在玩这个,这是我的 2 美分。祝你们好运!
第 1 步:创建连接处理程序
import netmiko
connection = netmiko.ConnectHandler(ip="192.168.30.161", device_type='cisco_ios', username='cisco', password='cisco123')
第 2 步:检查连接
connection
第 3 步:对于 Cisco 路由器和交换机,您期待expect_string='[确认]'
connection.send_command('reload', expect_string='[confirm]') 'Proceed with reload? [confirm]'
connection.send_command('\n')
或
connection.send_command('y')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.8/dist-packages/netmiko/utilities.py", line 347, in wrapper_decorator
return func(self, *args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 1368, in send_command
prompt = self.find_prompt(delay_factor=delay_factor)
File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 1107, in find_prompt
self.write_channel(self.RETURN)
File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 436, in write_channel
self._write_channel(out_data)
File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 394, in _write_channel
self.remote_conn.sendall(write_bytes(out_data, encoding=self.encoding))
File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 846, in sendall
sent = self.send(s)
File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 801, in send
return self._send(s, m)
File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 1198, in _send
raise socket.error("Socket is closed")
OSError: Socket is closed
结果:
您的 Cisco 路由器或交换机应该重新加载。
*4 月 14 日 08:06:18.842:%SYS-5-RELOAD:思科在 vty0 (192.168.30.181) 上请求重新加载。重新加载原因:重新加载命令。
*4 月 14 日 08:06:21.873 请求重新加载