Ну что, народ, погнали!
Сегодня на повестке дня встроенный модуль в Python, а именно - ftplib. Она позволяет работать с FTP сервером, загружать и скачивать файлы, управлять директориями, а также выполнять команды FTP-сервера.
Спросишь - "Ну и зачем мне этот ваш FTP?". А я отвечу что с помощью него выполняют ряд задач:
- развертывание сайтов (загрузка файлов на сервак)
- автоматический бэкап данных
- обмен файлами между системами
Когда стоит использовать FTP, а когда забыть про него?
Он хорош, когда безопасность не особо критична и нужна простая передача файлов. SFTP (Secure FTP) - вот этот пирожок уже более надежен, потому что он шифрует данные. Если сервер не поддерживает SFTP, то можно использовать обычный FTP с TLS/SSL (FTPS).
Подключаемся к матрице...
В данной библиотеке для этого используется класс FTP. Простейший способ выглядит вот так:
from ftplib import FTP
ftp = FTP('ftp.example.com') # Адрес FTP-сервера
ftp.login('username', 'password')
print(ftp.getwelcome()) # выведет сообщение от сервера при подключении
Ну тут в целом понятно все. Адрес, логин и пароль - стандартные штуки для таких махинаций. Если сервер поддерживает анонимный вход, то можно не передавать логин и пароль в ftp.login().
Что за анонимный вход?
Это такой режим, когда ты можешь зайти в дверь FTP без логина и пароля. Зачем? Для публичного доступа к каким-либо файлам, без необходимости регистрации. Например, зеркала файлов, архивные документы всякие, публичные серверы для обмена файлами. Но все равно не всегда пользуйся такими штуками. Любой может подключиться и скачать файлы, а иногда и загрузить, если сервер неправильно настроен.
Основные команды FTP
Давай выведем список файлов в текущей директории:
ftp.retrlines('LIST')
Это аналог команды ls -l в Линуксе - покажет расширенную информацию о файлах. Если надо получить просто список имён файлов, то можешь воспользоваться вот такой командой:
print(ftp.nlst())
Это аналог команды ls. Так, теперь ты хочешь посмотреть само место или директорию, файлы которой просматривал ранее:
print(ftp.pwd())
И тут резко ты понимаешь что находишься не в том месте и тебе надо сменить свое местоположение. В этом поможет команда:
ftp.cwd('need_directory')
И вот теперь то ты попал в нужное место. Здесь тебе надо создать новую или удалить существующую папку:
ftp.mkd('new_folder') # Создаст папку
ftp.rmd('new_folder') # Удалит папку
Работа с файлами
Жонглировать папками это здорово, но пора добавить новые шарики - файлы.
Загрузка файла на сервер
Чтобы загрузить файл надо познать Дзен. Ладно, просто использовать команду storbinary - для бинарных файлов. Например, картинки, фотки, архивы. Либо storlines - для текстовых файлов.
with open('local_file.txt', 'rb') as file:
ftp.storbinary('STOR remote_file.txt', file)
Обрати внимание, что при чтении файла ты указываешь локальное его название, а при выполнении команды пишешь как файл будет называться на сервере. Если надо загрузить текстовый файл построчно, то делай вот так:
with open('local_file.txt', 'r') as file:
ftp.storlines('STOR remote_file.txt', file)
Скачивание файла с сервера
Теперь разберемся как получить нужный файлик на нашу локальную машину. retrbinary - для бинарных файлов и retrlines - для текстовых.
with open('downloaded_file.txt', 'wb') as file:
ftp.retrbinary('RETR remote_file.txt', file.write)
Удаление файла
Пришло время чистить место на сервере. Используй вот такую комбинацию:
ftp.delete('remote_file.txt')
Работа в разных режимах
А это что такое? Смотри, когда клиент подключается к FTP-серверу, то у него открывается 2 чакры. Ладно, 2 соединения:
- Командное соединение - для отправки команд. Например, LIST, STOR, RETR
- Данные соединения - для передачи файлов и директорий
Так вот в активном режиме клиент открывает порт у себя и сообщает серверу куда отправлять данные. Сервер же подключается к этому порту и делает свои дела. В пассивном режиме клиент запрашивает у сервера открыть порт для передачи данных. Сервер сообщает клиенту, какой порт можно использовать. И далее клиент сам подключается к серверу для получения данных.
И зачем это? В активном режиме firewall может блокировать входящие соединения от сервера, а в пассивном клиент сам инициирует соединение, поэтому защитник спокоен.
Переключаемся между режимами
По умолчанию Python использует активный режим, но можно легко переключиться:
ftp.set_pasv(True) # включаем пассивный режим
ftp.set_pasv(False) # включаем активный режим
Закрытие соединения
После работы с FTP обязательно надо закрывать соединение, иначе сервер может блокировать дальнейшие попытки подключения.
ftp.quit()
Подводим черту
Итак, сегодня немного познакомились со встроенной библиотекой в Python. Как обычно напоминаю про использование переменных окружения, в которых надо хранить личную информацию, а также обработку исключений и ошибок не забывай применять. Для базового использования этого думаю достаточно.