Лого

ftplib Python

Ну что, народ, погнали!

Сегодня на повестке дня встроенный модуль в 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. Как обычно напоминаю про использование переменных окружения, в которых надо хранить личную информацию, а также обработку исключений и ошибок не забывай применять. Для базового использования этого думаю достаточно.