Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 30, 2015 22:29:58

devnull01
Зарегистрирован: 2015-10-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с exeptions

Доброго времени суток!
Не могу разобраться с перехватом исключений.
Код

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()

Вроде в try обернул, но все равно пишет

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

Заранее спасибо за помощь!

Офлайн

#2 Окт. 31, 2015 01:44:24

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Не могу разобраться с exeptions

В трейсбеке не указана исходная строчка кода в которой произошла ошибка. М.б. ошибка происходит за конструкцией try? ибо выглядит все корректно



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Окт. 31, 2015 09:03:58

devnull01
Зарегистрирован: 2015-10-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с exeptions

Проблема, насколько я понимаю, кроется в библиотеке 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

Но как так может произойти? Ведь все вызовы paramiko обернуты в try?

Офлайн

#4 Окт. 31, 2015 12:05:44

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Не могу разобраться с exeptions

Я смог воспроизвести ошибку. Для этого в качестве порта указал порт ftp сервера. Ситуация такая - try except отрабатывают. Функция возвращает код завершения. Однако, происходит с точки зрения интерпретатора неординарная ситуация - во время исключительной ситуации возбуждает другое исключение. Интерпретатор спешит об этом сообщить на стандартный поток ошибок. Собственно это вы и видите. Т.о. все в порядке и вы можете выполнять свой код далее.
Если вам прям вот надо от этого избавиться…то это уже другой вопрос.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Окт. 31, 2015 21:41:00

devnull01
Зарегистрирован: 2015-10-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с exeptions

возможно ли как то получить этот самый exeption, что бы знать, что неверно указан порт? да и от вывода было бы избавиться не плохо (но не просто заткнуть, а перехватить как нибудь)

Отредактировано devnull01 (Окт. 31, 2015 21:41:13)

Офлайн

#6 Ноя. 1, 2015 03:48:33

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Не могу разобраться с exeptions

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
Возможно ли как то получить этот самый exeption, что бы знать, что неверно указан порт?
Для работы с исключениями есть модуль traceback, там весь необходимый функционал есть.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Ноя. 1, 2015 16:19:55

devnull01
Зарегистрирован: 2015-10-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с exeptions

спасибо большое!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version