Форум сайта python.su
Добрый день Уважаемые.
Есть программа которая заходит на разные системы (специализированные) и выкачивает некое количетсво файлов. Написал все через pysftp все работает хорошо. НО….
Когда сервер с которого качает данные вадет вот такую шнягу
paramiko.transport: Rekeying, logfile:
DEB [20150325-16:26:53.746] thr=1 paramiko.transport: starting thread (client mode): INF [20150325-16:26:53.814] thr=1 paramiko.transport: Connected (version 2.0, client OpenSSH) DEB [20150325-16:26:53.815] thr=1 paramiko.transport: kex algos:['diffie-hellman-group1-sha1'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['3des-cbc', 'blowfish-cbc', 'cast128-cbc'] server encrypt:['3des-cbc', 'blowfish-cbc', 'cast128-cbc'] client mac:['hmac-sha1', 'hmac-md5', 'hmac-ripemd160@openssh.com'] server mac:['hmac-sha1', 'hmac-md5', 'hmac-ripemd160@openssh.com'] client compress:['zlib', 'none'] server compress:['zlib', 'none'] client lang:[''] server lang:[''] kex follows?False DEB [20150325-16:26:53.815] thr=1 paramiko.transport: Ciphers agreed: local=blowfish-cbc, remote=blowfish-cbc DEB [20150325-16:26:53.816] thr=1 paramiko.transport: using kex diffie-hellman-group1-sha1; server key type ssh-rsa; cipher: local blowfish-cbc, remote blowfish-cbc; mac: local hmac-sha1, remote hmac-sha1; compression: local none, remote none DEB [20150325-16:26:54.036] thr=1 paramiko.transport: Switch to new keys ... DEB [20150325-16:26:54.047] thr=2 paramiko.transport: Attempting password auth... DEB [20150325-16:26:54.236] thr=1 paramiko.transport: userauth is OK INF [20150325-16:26:54.453] thr=1 paramiko.transport: Authentication (password) successful! DEB [20150325-16:26:54.456] thr=2 paramiko.transport: [chan 1] Max packet in: 34816 bytes DEB [20150325-16:26:54.466] thr=1 paramiko.transport: [chan 1] Max packet out: 32768 bytes INF [20150325-16:26:54.467] thr=1 paramiko.transport: Secsh channel 1 opened. DEB [20150325-16:26:54.475] thr=1 paramiko.transport: [chan 1] Sesch channel 1 request ok INF [20150325-16:26:54.511] thr=2 paramiko.transport.sftp: [chan 1] Opened sftp connection (server version 3) DEB [20150325-16:26:54.511] thr=2 paramiko.transport.sftp: [chan 1] stat('{dir}') DEB [20150325-16:26:54.575] thr=2 paramiko.transport.sftp: [chan 1] normalize('{dir}') DEB [20150325-16:26:54.639] thr=2 paramiko.transport.sftp: [chan 1] listdir('{dir}') DEB [20150325-16:26:54.955] thr=2 paramiko.transport.sftp: [chan 1] stat('{dir}/.ssh') DEB [20150325-16:26:54.997] thr=2 paramiko.transport.sftp: [chan 1] normalize('{dir}/.ssh') DEB [20150325-16:26:55.061] thr=2 paramiko.transport.sftp: [chan 1] stat('{dir}/.ssh') ........ DEB [20150325-16:28:02.959] thr=2 paramiko.transport.sftp: [chan 1] open('{dir}', 'rb') DEB [20150325-16:28:03.173] thr=2 paramiko.transport.sftp: [chan 1] open('{dir}', 'rb') -> 00000000 DEB [20150325-16:28:03.174] thr=2 paramiko.transport.sftp: [chan 1] stat('{dir}') DEB [20150325-16:28:03.705] thr=2 paramiko.transport.sftp: [chan 1] close(00000000) ...... DEB [20150325-16:47:29.110] thr=1 paramiko.transport: Rekeying (hit 55437 packets, 536872092 bytes received) DEB [20150325-16:47:59.156] thr=2 paramiko.transport.sftp: [chan 1] close(00000000) INF [20150325-16:57:07.071] thr=3 paramiko.transport.sftp: [chan 1] sftp session closed. DEB [20150325-16:57:07.071] thr=3 paramiko.transport: [chan 1] EOF sent (1) DEB [20150325-16:57:07.095] thr=1 paramiko.transport: EOF in transport thread DEB [20150325-16:57:07.172] thr=3 paramiko.transport: Dropping user packet because connection is dead. DEB [20150325-16:57:07.272] thr=3 paramiko.transport: Dropping user packet because connection is dead.
Отредактировано erl (Март 30, 2015 12:50:23)
Офлайн
в этом скрипте отсутствует правило для повторного переподключения при разрыве связи(в данном случае занятасти потока). Нужно в скипт добавить обработчик ошибок. И правило которе при получении именно этой ошибки будет выдавать запрос на подключение. Подробнее посмотри как писать привила обработки тут http://pythonworld.ru/tipy-dannyx-v-python/isklyucheniya-v-python-konstrukciya-try-except-dlya-obrabotki-isklyuchenij.html
Надо немного модифицировать эту часть кода или дописать правило именно для этой ошибки.
except Exception as exc: if str(exc).lower().find("key-exchange timed out waiting for key negotiation") >= 0: print "Renegatiation procedure drop" sshPointer.close() else: print str(exc) print str(sys.exc_info()[0]) print str(sys.exc_info()[1]) print str(traceback.print_exc())
Отредактировано sypper-pit (Март 30, 2015 03:21:48)
Офлайн
Спасибо за советы.
python 2.7
Я скорее не правильно выразился, извините пожалуйста. Не зря же я поместил вопрос в раздел для профисионалов. Постораюсь уточнить.
Понятно что нужно переконекчиватся. И понятно где писать код для этого.
Непонятно вот что. Мы собираем список директории в функции get_mirror в список listDirectory после этого выкачиваем все файлы в указанной директории, далее просматриваем список директории и входя в них по очереди функция вызывает сама себя и повторяет процесс скачивания и сбора внутренних директорий, пока не дойдет до директории в которой нет вложенных директорий.
Когда срабатывает Exception и мы выходим из процедуры для того что бы переконектится.
Как потом понять что уже скачано, а что нет ?
Как продолжить с того место на котором произошел rekeying ?
Упрощенно: как вернуться в то место в котором все прервалось и докачать ?
Офлайн
Система многопотная или нет?
Офлайн
Нет, все качается в один поток.
Офлайн
erlТогда добавь правило исключения.
Нет, все качается в один поток.
Офлайн
Здравствуйте Добрые люди.
Решение:
self.trans = paramiko.Transport((hostname, port))
self.trans.packetizer.REKEY_BYTES = pow(2, 40) # 1TB max, this is a security degradation
self.trans.packetizer.REKEY_PACKETS = pow(2, 40) # 1TB max, this is a security degradation
self._transport.packetizer.REKEY_BYTES = pow(2, 40)
self._transport.packetizer.REKEY_PACKETS = pow(2, 40)
Отредактировано erl (Апрель 17, 2015 12:13:21)
Офлайн