Форум сайта python.su
Доброго времени суток!
Не могу разобраться с перехватом исключений.
Код
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
Офлайн
В трейсбеке не указана исходная строчка кода в которой произошла ошибка. М.б. ошибка происходит за конструкцией try? ибо выглядит все корректно
Офлайн
Проблема, насколько я понимаю, кроется в библиотеке 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
Офлайн
Я смог воспроизвести ошибку. Для этого в качестве порта указал порт ftp сервера. Ситуация такая - try except отрабатывают. Функция возвращает код завершения. Однако, происходит с точки зрения интерпретатора неординарная ситуация - во время исключительной ситуации возбуждает другое исключение. Интерпретатор спешит об этом сообщить на стандартный поток ошибок. Собственно это вы и видите. Т.о. все в порядке и вы можете выполнять свой код далее.
Если вам прям вот надо от этого избавиться…то это уже другой вопрос.
Офлайн
возможно ли как то получить этот самый exeption, что бы знать, что неверно указан порт? да и от вывода было бы избавиться не плохо (но не просто заткнуть, а перехватить как нибудь)
Отредактировано devnull01 (Окт. 31, 2015 21:41:13)
Офлайн
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, что бы знать, что неверно указан порт?
Офлайн
спасибо большое!
Офлайн