我目前正在尝试编写脚本以通过paramiko读取shell,到目前为止,如果我提示一个命令,它会很好用。
问题是我的实际目标是处理调试流,并且我当然不能使用超时,因为脚本应该不受时间限制地进行监听。
因此,另一种选择是让用户使用 ctrl - c 停止流。我添加了一个“尝试,除外”处理程序,例如
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.")
我也试图将try-except放在while循环之外,但是没有用。我还尝试了很多在google上发现的建议,但它们也都没有用:它们最终都停止了脚本,但是所有这些都需要5到10分钟。