В настоящее время я пытаюсь написать скрипт для чтения оболочки через paramiko, и, безусловно, если я предложу одну команду, она прекрасно работает.
проблема в том, что моя настоящая цель - обработатьпоток отладки и, конечно, я не могу использовать тайм-аут, потому что скрипт должен слушать без ограничений по времени.
Так что другой вариант - позволить пользователю остановить поток с помощью ctrl - c.Я добавил обработчик «try, кроме», например
except (IOError, SystemExit):
raise
except KeyboardInterrupt:
print ("Crtl+C Pressed. Shutting down.")
, и казалось, что он не работает: ничего не происходит при нажатии ctrl-c.Но потом я понял, что это заняло вечность: через несколько минут скрипт фактически останавливается и появляется сообщение.
Кто-нибудь знает, как решить эту проблему?
только для справки здесьмой код
import paramiko
import time
import re
import socket
import os
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
address = '192.168.1.1'
username = 'admin'
password = ''
ssh.connect(address, port=22, username = username, password = password)
shell = ssh.invoke_shell(height=400)
shell.settimeout(2)
def prompt_console(command = '', channel = shell, timeout = False):
print(channel.recv(9999).decode('utf-8')) #<-- this is for removing the initial prompt from buffer
if timeout == False:
shell.settimeout(3600) #<--increasing the timeout
channel.send(command+'\n')
log = ''
while True:
try:
log += channel.recv(1).decode('utf-8') #<--every loop it loads a char into the "log" variable
if log[-9:] == '--More-- ':
shell.send(" ")
log.replace('--More-- \r \r\t\t','\r\t\t')
if len(re.findall('.*\n',log))>0: #<--it yields every line to python console
yield log
log = ''
except (IOError, SystemExit):
raise
except KeyboardInterrupt:
print ("Crtl+C Pressed. Shutting down.")
Я также пытался поместить попытку - за исключением цикла while, но он не работал.Я также перепробовал множество предложений, которые нашел в Google, но они тоже не сработали: все они в конечном итоге останавливают скрипт, но для всех это занимает 5-10 минут.