





Я сам не пробовал (да, я просто использовал Google и переходил по некоторым ссылкам), но http://www.lag.net/paramiko/ кажется рекомендуемым решением. На первый взгляд, это реализация SSH на чистом Python, которая позволяет туннелировать для таких вещей, как FTP.
Обновление: комментатор указал, что я перепутал sftp и ftps, извините. Я все же предлагаю хотя бы кратко изучить Парамико, чтобы убедиться, что он соответствует требованиям.
Скрученный, похоже, имеет некоторую реализацию FTPS (FTP через SSL) в подпроекте раковина. Я не эксперт, но Глиф, сам человек скрученный, указан на этом сайте. Возможно, ответив на его отвечать по другому вопросу, вы сможете найти более подробную информацию (удачи).
Спасибо за затычку :). Но FTPS (FTP, но через SSL) - это не то же самое, что SFTP (передача файлов через SSH, вообще не связанная с протоколом FTP).
Я считаю, что вы могли бы использовать Twisted для реализации FTPS, просто используя его реализацию FTP, но изменив атрибут FTPClient.connectFactory на функцию, которая что-то делает с connectSSL, а не с connectTCP.
Вы уверены, что хотите FTPS? SFTP - это другой, лучший и гораздо более популярный протокол в наши дни: Twisted также содержит реализация SFTP.
connectSSL может использоваться для неявного соединения FTPS, но явный FTPS (с использованием команды AUTH) более популярен, чем неявный FTPS. Тем не менее реализация Twisted FTP - хорошее начало. Следующим шагом может стать реализация AUTH (и co) вместе с изменением DTP.connectionMade.
Мне не удалось найти бесплатный клиент sftp для Windows, поэтому в итоге я обернул PSFTP Putty с помощью модуля подпроцесса python. Я бы, наверное, использовал извращенную реализацию, упомянутую Glyph, если бы знал об этом.
В любом случае, если вам интересно, он доступен по адресу:
M2Cypto имеет модуль FTPS. Из документация:
>>> from M2Crypto import ftpslib
>>> f = ftpslib.FTP_TLS()
>>> f.connect('', 9021)
'220 spinnaker.dyndns.org M2Crypto (Medusa) FTP/TLS server v0.07 ready.'
>>> f.auth_tls()
>>> f.set_pasv(0)
>>> f.login('ftp', 'ngps@')
'230 Ok.'
>>> f.retrlines('LIST')
-rw-rw-r-- 1 0 198 2326 Jul 3 1996 apache_pb.gif
drwxrwxr-x 7 0 198 1536 Oct 10 2000 manual
drwxrwxr-x 2 0 198 512 Oct 31 2000 modpy
drwxrwxr-x 2 0 198 512 Oct 31 2000 bobo
drwxr-xr-x 2 0 198 14336 May 28 15:54 postgresql
drwxr-xr-x 4 100 198 512 May 16 17:19 home
drwxr-xr-x 7 100 100 3584 Sep 23 2000 openacs
drwxr-xr-x 10 0 0 512 Aug 5 2000 python1.5
-rw-r--r-- 1 100 198 326 Jul 29 03:29 index.html
drwxr-xr-x 12 0 0 512 May 31 17:08 python2.1
'226 Transfer complete'
>>> f.quit()
'221 Goodbye.'
>>>
В качестве альтернативы, если вы хотите свести к минимуму использование сторонних модулей, вы должны иметь возможность создать подкласс стандартной библиотеки ftplib.FTP со встроенной (для Python) поддержкой SSL. Однако M2Crypto (или Скрученный, если вы хотите пойти по этому пути) - более простое решение.
Что касается реализации сервера, вы можете взглянуть на pyftpdlib: http://code.google.com/p/pyftpdlib/ Он включает демонстрационный скрипт, реализующий работающий сервер FTPS: http://code.google.com/p/pyftpdlib/source/browse/trunk/demo/tls_ftpd.py
Что касается реализации клиента, я предоставил патч, который будет включен в Python 2.7 и 3.2. http://bugs.python.org/issue2054
Модуль ftplib в Python версии 2.7.1 имеет все необходимые функции, включая поддержку TLS.
sftp и ftps - это не одно и то же.