Найти - Пользователи
Полная версия: paramiko sftp rekeying как правильно проделать данную процедуру
Начало » Python для экспертов » paramiko sftp rekeying как правильно проделать данную процедуру
1
erl
Добрый день Уважаемые.

Есть программа которая заходит на разные системы (специализированные) и выкачивает некое количетсво файлов. Написал все через 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.

После этого все прерывается, файлы с сервера не скачиваются, ssh2 сессия down.

Как грамотно выполнить процедуру rekeying что бы продолжить закачивать файлы с сервера ?

Код здесь

Pytrhon2.7
sypper-pit
в этом скрипте отсутствует правило для повторного переподключения при разрыве связи(в данном случае занятасти потока). Нужно в скипт добавить обработчик ошибок. И правило которе при получении именно этой ошибки будет выдавать запрос на подключение. Подробнее посмотри как писать привила обработки тут 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())
в ней добавить правило именно для вашей ошибки.
Если исправиле загрузите ваш правильный код на форум если не сложно и вам будет + и в последющем людям пользоваться можно.

Так же пишите какую ветку питона используете 2 или 3
http://resources.arcgis.com/ru/help/main/10.1/index.html#//002z0000000q000000
erl
Спасибо за советы.
python 2.7
Я скорее не правильно выразился, извините пожалуйста. Не зря же я поместил вопрос в раздел для профисионалов. Постораюсь уточнить.
Понятно что нужно переконекчиватся. И понятно где писать код для этого.

Непонятно вот что. Мы собираем список директории в функции get_mirror в список listDirectory после этого выкачиваем все файлы в указанной директории, далее просматриваем список директории и входя в них по очереди функция вызывает сама себя и повторяет процесс скачивания и сбора внутренних директорий, пока не дойдет до директории в которой нет вложенных директорий.

Когда срабатывает Exception и мы выходим из процедуры для того что бы переконектится.
Как потом понять что уже скачано, а что нет ?
Как продолжить с того место на котором произошел rekeying ?
Упрощенно: как вернуться в то место в котором все прервалось и докачать ?
sypper-pit
Система многопотная или нет?
erl
Нет, все качается в один поток.
sypper-pit
erl
Нет, все качается в один поток.
Тогда добавь правило исключения.
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

Так как pysftp основывается на paramiko, то в коде pysftp модуля (pysftp.py), после строки 152 вставляем код:
self._transport.packetizer.REKEY_BYTES = pow(2, 40)
self._transport.packetizer.REKEY_PACKETS = pow(2, 40)

смотрите: class Connection, def __init__.

ссылка: https://github.com/paramiko/paramiko/issues/175

После этого rekey будет выполнен после того как скачается 1 TB трафика через одну сессию.

все try except блоки убираются.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB