Привет, сообщество Stackoverflow!
Netmiko не был стабильным для меня сегодня, поэтому я решил обновить его до версии 3.0.0. Хотя его стабильность возросла, я заметил, что больше не могу отправлять баннеры exe c строк на устройства cisco. Вчера я смог успешно развернуть это на почти 100 устройствах.
Вот упрощенная версия кода, который я устраняю.
import threading
import time
import re
import pdb
import difflib
from netmiko import NetMikoAuthenticationException
from netmiko import ConnectHandler
from datetime import datetime
import logging
logging.basicConfig(filename='test.log', level=logging.DEBUG)
logger = logging.getLogger("netmiko")
class MyThread(threading.Thread):
def run(self):
date = datetime.now()
date_file = date.strftime("%Y-%b-%d_%H%M%S")
print("{} started!".format(self.getName()))
IP = self.getName().split(" ")[-1]
my_device = {
"host": IP,
"username": "cisco_ios_user",
"password": "cisco_ios_pwd",
"device_type": "cisco_ios",
"secret": "cisco_ios_pwd"
}
try:
print("--- Connecting to device " + IP)
net_connect = ConnectHandler(**my_device)
net_connect.enable()
hostname = net_connect.find_prompt().rstrip(">").rstrip("#").rstrip(">t")
print(" Connected to " + hostname)
location = "Central_1"
serial = "FTX0945W0MY"
config = ""
#config = config + "\n!"
config = config + "\nbanner exec ^"
config = config + "\nSite Location: " + location
config = config + "\nHostname: " + hostname
config = config + "\nModel: 3725"
config = config + "\nChassis Serial Number: " + serial
config = config + "\nAsset: None"
config = config + "\n^"
config = config + "\n"
print("Config is:" + config)
log = net_connect.send_config_set(config)
print(log)
for line in config.splitlines():
print(line)
print("{} finished!".format(self.getName()))
except NetMikoAuthenticationException:
print("ERROR for " + IP + ": Authentication Error @ " + date_file)
print('# ' * 40 + "\n")
f = open("run_summary.txt", "a")
f.write("\n" + "unknown, " + IP + ", " + "AuthenticationError, " + date_file)
f.close()
def main():
with open('inventory.txt') as IP_LIST:
for IP in IP_LIST:
IP = IP.rstrip("\n")
my_thread = MyThread(name="Script for device {}".format(IP))
my_thread.start()
time.sleep(300)
if __name__ == '__main__':
main()
Вывод:
--- Connecting to device 192.168.163.101
Connected to R1_Router
Config is:
banner exec ^
Site Location: Central_1
Hostname: R1_Router
Model: 3725
Chassis Serial Number: FTX0945W0MY
Asset: None
^
Exception in thread Script for device 192.168.163.101:
Traceback (most recent call last):
File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\paramiko\channel.py", line 699, in recv
out = self.in_buffer.read(nbytes, self.timeout)
File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\paramiko\buffered_pipe.py", line 164, in read
raise PipeTimeout()
paramiko.buffered_pipe.PipeTimeout
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\netmiko\base_connection.py", line 541, in _read_channel_expect
new_data = self.remote_conn.recv(MAX_BUFFER)
File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\paramiko\channel.py", line 701, in recv
raise socket.timeout()
socket.timeout
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 926, in _bootstrap_inner
self.run()
File "C:/Users/user/PycharmProjects/untitled/network modules/2020-02-01 - Threading/multiline send_config.py", line 54, in run
log = net_connect.send_config_set(config)
File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\netmiko\base_connection.py", line 1726, in send_config_set
new_output = self.read_until_pattern(pattern=re.escape(cmd.strip()))
File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\netmiko\base_connection.py", line 618, in read_until_pattern
return self._read_channel_expect(*args, **kwargs)
File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\netmiko\base_connection.py", line 552, in _read_channel_expect
"Timed-out reading channel, data not available."
netmiko.ssh_exception.NetmikoTimeoutException: Timed-out reading channel, data not available.
Я отладил это, и похоже, что он ожидает приглашения R1_Router #. Возможно, он не получает ожидаемое приглашение, потому что после ввода «banner exe c ^» в ответ на приглашение «Введите текстовое сообщение. Заканчивается символом« ^ ».» , Но я могу ошибаться или это может быть красная сельдь.
DEBUG:netmiko:_read_channel_expect read_data: R1_Router(config)#
DEBUG:netmiko:Pattern found: #
R1_Router(config)#
DEBUG:netmiko:write_channel: b'banner exec ^\n'
DEBUG:netmiko:Pattern is: banner\ exec\ \^
DEBUG:netmiko:_read_channel_expect read_data: b
DEBUG:netmiko:_read_channel_expect read_data: anner exe
DEBUG:netmiko:_read_channel_expect read_data: c ^
Enter TEXT message. End with the character '^'.
DEBUG:netmiko:Pattern found: banner\ exec\ \^ banner exec ^
Enter TEXT message. End with the character '^'.
DEBUG:netmiko:Pattern is: (?:R1_Router|#)
Не уверен, что причиной является обновление пакета netmiko. Моя версия paramiko в настоящее время 2.6.0 и есть 2.7.1 доступная, но я еще не пробовал это. Мы будем благодарны за любые мысли о том, как это можно решить. Заранее спасибо. :)