Форум сайта python.su
0
Доброго времени суток!
Не могу разобраться с перехватом исключений.
Код
def ssh_connect(host, username, password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect(host, port=22, username=username, password=password) except paramiko.ssh_exception.BadAuthenticationType: print(logbadhost + host + " is not accept passwors") logger.log(3, logbadhost + host + " is not accept passwors") return 2 except paramiko.ssh_exception.AuthenticationException: logger.log(2, logbadpass + username + "@" + host + ":" + password) return 1 except paramiko.ssh_exception.SSHException: logger.log(3, logbadhost + host + " is ebnytii kakoito") return 2 except socket.timeout: logger.log(3, logbadhost + host + " is down") return 2 except socket.error as e: # print(e) return except ConnectionRefusedError as e: # print(e) logger.log(3, logbadhost + host + " is ebnytii kakoito") return 2 except EOFError as e: # print(e) logger.log(3, logbadhost + host + " is ebnytii kakoito") return 2 except: return 2 else: print(loggoodpass + username + "@" + host + ":" + password) logger.log(4, loggoodpass + username + "@" + host + ":" + password) return 0 finally: ssh.close()
Exception: Error reading SSH protocol banner Bad file descriptor
Traceback (most recent call last):
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1707, in _check_banner
buf = self.packetizer.readline(timeout)
File “/usr/local/lib/python3.4/dist-packages/paramiko/packet.py”, line 281, in readline
buf += self._read_timeout(timeout)
File “/usr/local/lib/python3.4/dist-packages/paramiko/packet.py”, line 434, in _read_timeout
x = self.__socket.recv(128)
OSError: Bad file descriptor
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1584, in run
self._check_banner()
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1711, in _check_banner
raise SSHException('Error reading SSH protocol banner' + str(e))
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner Bad file descriptor
Офлайн
221
В трейсбеке не указана исходная строчка кода в которой произошла ошибка. М.б. ошибка происходит за конструкцией try? ибо выглядит все корректно
Офлайн
0
Проблема, насколько я понимаю, кроется в библиотеке paramiko. Она используется только в этой функции, а она (функция) вся в try. Если попробовать подключиться к хосту через встроенный ssh клиент, возникает ошибка “подключение сброшено”.
Еще бывают вот такие ошибки:
Exception: Error reading SSH protocol banner Connection reset by peer
Traceback (most recent call last):
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1707, in _check_banner
buf = self.packetizer.readline(timeout)
File “/usr/local/lib/python3.4/dist-packages/paramiko/packet.py”, line 281, in readline
buf += self._read_timeout(timeout)
File “/usr/local/lib/python3.4/dist-packages/paramiko/packet.py”, line 434, in _read_timeout
x = self.__socket.recv(128)
ConnectionResetError: Connection reset by peer
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1584, in run
self._check_banner()
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1711, in _check_banner
raise SSHException('Error reading SSH protocol banner' + str(e))
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner Connection reset by peer
Офлайн
221
Я смог воспроизвести ошибку. Для этого в качестве порта указал порт ftp сервера. Ситуация такая - try except отрабатывают. Функция возвращает код завершения. Однако, происходит с точки зрения интерпретатора неординарная ситуация - во время исключительной ситуации возбуждает другое исключение. Интерпретатор спешит об этом сообщить на стандартный поток ошибок. Собственно это вы и видите. Т.о. все в порядке и вы можете выполнять свой код далее.
Если вам прям вот надо от этого избавиться…то это уже другой вопрос.
Офлайн
0
возможно ли как то получить этот самый exeption, что бы знать, что неверно указан порт? да и от вывода было бы избавиться не плохо (но не просто заткнуть, а перехватить как нибудь)
Отредактировано devnull01 (Окт. 31, 2015 21:41:13)
Офлайн
221
devnull01вы можете оперировать внутри программы потоками вывода. Для этого наверняка подойдет любой файло-подобный объект. Для linux например вполне корректно делать так:
от вывода было бы избавиться не плохо (но не просто заткнуть, а перехватить как нибудь)
>>> import sys >>> _s = sys.stderr >>> sys.stderr = open('/dev/null', 'w') >>> >>> print('qwe') qwe >>> 1/0 >>> >>> sys.stderr = _s >>> >>> 1/0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero >>>
devnull01Для работы с исключениями есть модуль traceback, там весь необходимый функционал есть.
Возможно ли как то получить этот самый exeption, что бы знать, что неверно указан порт?
Офлайн
0
спасибо большое!
Офлайн