Предотвратить тайм-аут сеанса SFTP / SSH с помощью paramiko - PullRequest
8 голосов
/ 23 марта 2011

Я использую paramiko для подключения к SFTP-серверу, на котором мне нужно загрузить и обработать некоторые файлы.

Тайм-аут сервера установлен на 5 минут, но иногда бывает, что обработка файлов может занять больше времени, чем тайм-аут. Итак, когда я хочу изменить рабочий каталог на сервере для обработки некоторых других файлов sftp.chdir(target_dir)), я получаю исключение, что время соединения истекло:

Файл buildbdist.win32eggparamikosftp: //ftp.py, строка 138, в _write_all рейз EOFError ()

Чтобы противостоять этому, я подумал, что активация поддержки активности будет лучшим вариантом, поэтому я использовал set_keepalive на транспорте, чтобы установить его на 30 секунд:

ssh = paramiko.SSHClient()
ssh.set_missing_hostkey_policy(paramiko.AutoAddPolicy())
ssh.connect(ssh_server, port=ssh_port, username=ssh_user, password=password)
transport = ssh.get_transport()
transport.set_keepalive(30)
sftp = transport.open_sftp_client()

Но ничего не меняется вообще. Изменение не имеет абсолютно никакого эффекта. Я не знаю, неправильно ли я понимаю концепцию set_keepalive здесь или, может быть, сервер (к которому у меня нет доступа) игнорирует keep alive пакетов.

Разве это не правильный способ противодействия этой проблеме, или я должен попробовать другой подход? Мне не нравится идея «вручную» посылать какую-либо команду ls на сервер, чтобы сохранить сеанс.

1 Ответ

3 голосов
/ 23 марта 2011

Если сервер отсчитывает время для бездействия, вы не можете многое сделать со стороны клиента (кроме, возможно, посылать простую команду время от времени, чтобы не дать тайм-ауту сеанса).

Рассматривали ли вы разделение этапов загрузки и обработки, чтобы можно было загрузить все необходимое для начала, затем обработать его либо асинхронно, либо после завершения всех загрузок?

...