Бывает нужно что-то скачать/загрузить на удалённый сервер FTP или FTPS (не путать с SFTP) в скрипте на пайтоне.
Подключаем необходимые библиотеки:
from ftplib import FTP_TLS from ftplib import FTP
Задаём параметры подключения к FTP хосту:
host = "some_ftp.com" port = 21 username = "username" password = "password"
Подключаемся к обычному FTP (в примере скачиваем файл на диск):
ftp = FTP(host) ftp.login(username, password) try: handle = open('/path_to_local_file/filename', 'wb') ftp.retrbinary('RETR /path_to_remote_file/filename, handle.write) handle.close() except: pass ftp.quit()
Все команда нужно указывать по спецификации FTP протокола, например такой.
Осовные команды:
RETR – получить файл с FTP в переменную или по хендлеру записать в локальный файл;
LIST – показать список файлов/директорий в указанной или текущей по-умолчанию;
NLST – то же, что и LIST, но возвращает только имена файлов/директорий;
STOR – загрузить с презаписью файл на FTP-сервер;
и другие
Подключение к FTPS выполняется схожим образом:
try: handle = open('/path_to_local_file/filename', 'wb') ftps = FTP_TLS(host) ftps.login(username, password) ftps.prot_p() ftps.retrbinary('RETR /path_to_remote_file/filename', handle.write) ftps.quit() handle.close() except: pass
Для работы FTP_TLS нужен пайтон 2.7+, если у вас только 2.6, то придётся сделать одно из следующего:
1. Доустановить пайтон 2.7, например как описано здесь для Oracle Linux 6:
Редактируем /etc/yum.repos.d/public-yum-ol6.repo и убеждаемся, что enabled=1 в следующем параграфе:
[ol6_software_collections] name=Software Collection Library release 3.0 packages for Oracle Linux 6 (x86_64) baseurl=http://yum.oracle.com/repo/OracleLinux/OL6/SoftwareCollections/x86_64/ gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle gpgcheck=1 enabled=1
Далее выполняем команды от рута/судо:
yum install scl-utils yum install python27 source /opt/rh/python27/enable python --version
Если при запуске скрипта по cron (а скорее всего так и будет) выбивает ошибку вида:
error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
То необходимо добавить путь к библиотеке в /etc/ld.so.conf и запустить команду ldconfig, которая сама всё пропишет.
или
2. Cкачать дистрибутив пайтона 2.7 отсюда и вытащить фал ftplib.py и положить его в папку со скриптом (если скрипт запускается по cron, то это может не сработать):
wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz tar -zxvf Python-2.7.1.tgz Python-2.7.1/Lib/ftplib.py cp Python-2.7.1/Lib/ftplib.py /path_to_script/
или
3. Заходить на FTPS вызывая bash команды например lftp с помощью модуля subprocess.
Ссылки:
- https://docs.python.org/3/library/ftplib.html
- https://stackoverflow.com/questions/11573817/how-to-download-a-file-via-ftp-with-python-ftplib
- https://stackoverflow.com/questions/20842732/libpython2-7-so-1-0-cannot-open-shared-object-file-no-such-file-or-directory
- https://docs.cloudera.com/documentation/enterprise/6/6.0/topics/install_python_27.html