Python + FTP: как автоматизировать передачу файлов на сервер

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Системные администраторы и DevOps-инженеры
  • Разработчики и программисты, интересующиеся автоматизацией процессов
  • Специалисты по работе с данными и инженеры данных

    Автоматизация передачи файлов – одна из тех задач, которая может превратить системного администратора из обычного специалиста в настоящего героя IT-отдела. FTP-протокол, несмотря на почтенный возраст, остаётся незаменимым инструментом для обмена данными между серверами. Объединение мощи Python и классического FTP открывает невероятные возможности для автоматизации рутинных операций с файлами. В этом руководстве я раскрою все секреты эффективной работы с FTP через Python — от базового подключения до продвинутых техник обеспечения безопасности. 🐍📂

Освоив Python для работы с FTP из этого руководства, вы можете углубить свои навыки на курсе Обучение Python-разработке от Skypro. Программа курса включает не только работу с сетевыми протоколами, но и полный спектр навыков веб-разработки на Python — от создания API до развертывания готовых решений. Инвестиция в эти знания быстро окупится, когда ваши скрипты будут безотказно работать, пока вы пьёте кофе. ☕

Основы FTP в Python: библиотека ftplib и её возможности

Библиотека ftplib – это встроенный модуль Python, предоставляющий все необходимые инструменты для взаимодействия с FTP-серверами. Она реализует клиентскую сторону протокола передачи файлов, позволяя программно выполнять все операции, которые обычно доступны через FTP-клиенты с графическим интерфейсом.

Главное преимущество ftplib – её наличие в стандартной библиотеке Python. Это означает, что вам не нужно устанавливать дополнительные пакеты – просто импортируйте модуль и начинайте работать:

Python
Скопировать код
import ftplib

# Создание FTP-объекта
ftp = ftplib.FTP()

Основной класс FTP предоставляет методы для всех стандартных FTP-операций:

  • connect() – установка соединения с сервером
  • login() – аутентификация на сервере
  • pwd() – получение текущего рабочего каталога
  • cwd() – смена рабочего каталога
  • dir() – получение списка файлов и директорий
  • retrbinary() – загрузка бинарных файлов с сервера
  • storbinary() – отправка бинарных файлов на сервер
  • delete() – удаление файлов
  • mkd() – создание директории
  • rmd() – удаление директории
  • quit() – завершение сеанса

Библиотека также поддерживает пассивный режим передачи данных, что критически важно при работе из-за NAT или файрволов.

Функция Описание Пример использования
FTP() Создание экземпляра FTP-клиента ftp = ftplib.FTP()
FTP_TLS() Создание защищенного FTP-клиента ftps = ftplib.FTP_TLS()
set_pasv() Установка пассивного режима ftp.set_pasv(True)
set_debuglevel() Установка уровня отладки ftp.set_debuglevel(2)

Для обеспечения безопасной передачи данных ftplib предлагает класс FTP_TLS, реализующий FTPS (FTP через SSL). Это особенно важно при передаче конфиденциальных данных:

Python
Скопировать код
from ftplib import FTP_TLS

ftps = FTP_TLS()
ftps.connect('ftp.example.com', 21)
ftps.login('username', 'password')
ftps.prot_p() # Включение защищенного режима для передачи данных

Алексей Новиков, DevOps-инженер Однажды я столкнулся с необходимостью ежедневно переносить логи с 50 серверов в центральное хранилище. Ручная работа занимала около двух часов. Написал простой скрипт на Python с использованием ftplib, который автоматически подключался к каждому серверу, находил нужные логи и отправлял их в хранилище. После запуска скрипта задача, ранее занимавшая 2 часа, стала выполняться за 3 минуты без моего участия. Коллеги были поражены, когда утром обнаружили все логи уже обработанными. Руководство настолько оценило экономию времени, что включило скрипт в стандартную процедуру обработки данных компании. Ключевым фактором успеха стала именно простота ftplib – от идеи до работающего решения прошло менее двух часов.

Пошаговый план для смены профессии

Подключение к FTP-серверу: аутентификация и базовые команды

Подключение к FTP-серверу с помощью Python – это последовательность из трёх шагов: создание объекта FTP, установка соединения и аутентификация. Рассмотрим базовый пример:

Python
Скопировать код
import ftplib

# Создание объекта FTP
ftp = ftplib.FTP()

# Подключение к серверу
ftp.connect('ftp.example.com', 21) # Хост и порт (21 – стандартный)

# Аутентификация
ftp.login('username', 'password') # Логин и пароль

# Проверка подключения
print(ftp.getwelcome()) # Выводит приветствие сервера

# Закрытие соединения после работы
ftp.quit()

Для удобства можно объединить создание объекта, подключение и аутентификацию в одну строку:

Python
Скопировать код
ftp = ftplib.FTP('ftp.example.com', 'username', 'password')

После успешного подключения доступны все базовые FTP-команды для навигации и управления файлами:

  • Получение списка файлов и директорий:
Python
Скопировать код
# Вывод содержимого текущей директории
ftp.dir() 

# Получение списка файлов в переменную
file_list = []
ftp.dir(file_list.append)
print(file_list)

# Получение списка имен файлов
filenames = ftp.nlst()
print(filenames)

  • Навигация по директориям:
Python
Скопировать код
# Узнать текущую директорию
current_dir = ftp.pwd()
print(f"Текущая директория: {current_dir}")

# Перейти в другую директорию
ftp.cwd('/path/to/directory')

# Подняться на уровень выше
ftp.cwd('..')

# Создать новую директорию
ftp.mkd('new_directory')

# Удалить директорию
ftp.rmd('directory_to_remove')

При работе с FTP-серверами часто требуется анализировать списки файлов. Метод nlst() возвращает только имена файлов, а для получения расширенной информации (размер, дата) можно использовать команду LIST с парсингом результатов:

Python
Скопировать код
# Получение детальной информации о файлах
details = []
ftp.dir(details.append)

for item in details:
# Парсинг строки с информацией о файле
print(item) # Например: "drwxr-xr-x 2 user group 4096 Jan 1 12:34 directory_name"

Тип аутентификации Описание Пример кода Уровень безопасности
Анонимный доступ Подключение без учетных данных ftp.login() Низкий
Обычная аутентификация Логин и пароль в открытом виде ftp.login('user', 'pass') Средний
FTPS (TLS/SSL) Шифрованное соединение ftps = FTP_TLS(); ftps.login('user', 'pass') Высокий
Ключи доступа Аутентификация по ключам Требует дополнительных библиотек Очень высокий

При работе с различными FTP-серверами важно учитывать особенности их конфигурации. Некоторые серверы требуют явного включения пассивного режима:

Python
Скопировать код
# Включение пассивного режима (рекомендуется в большинстве случаев)
ftp.set_pasv(True)

Для отладки проблем с соединением полезно включать режим отладки:

Python
Скопировать код
# Включение подробного вывода для отладки (0 – выкл., 1 – команды, 2 – подробно)
ftp.set_debuglevel(2)

Загрузка и скачивание файлов: практические Python-скрипты

Основные операции с FTP – это загрузка файлов с сервера (download) и выгрузка файлов на сервер (upload). Библиотека ftplib предоставляет методы retrbinary() и storbinary() для работы с бинарными файлами – именно их следует использовать в большинстве случаев. 🔄

Рассмотрим пример скачивания файла с FTP-сервера:

Python
Скопировать код
import ftplib

def download_file(server, username, password, remote_path, local_path):
"""
Скачивает файл с FTP-сервера

Args:
server (str): Адрес FTP-сервера
username (str): Имя пользователя
password (str): Пароль
remote_path (str): Путь к файлу на сервере
local_path (str): Локальный путь для сохранения
"""
try:
# Подключение к серверу
with ftplib.FTP(server) as ftp:
ftp.login(username, password)

# Открытие локального файла для записи
with open(local_path, 'wb') as local_file:
# Скачивание файла
ftp.retrbinary(f'RETR {remote_path}', local_file.write)

print(f"Файл успешно скачан: {local_path}")
return True

except Exception as e:
print(f"Ошибка при скачивании файла: {str(e)}")
return False

# Пример использования
download_file('ftp.example.com', 'user', 'password', 
'/path/to/remote/file.csv', 'local_file.csv')

Теперь рассмотрим пример загрузки файла на FTP-сервер:

Python
Скопировать код
def upload_file(server, username, password, local_path, remote_path):
"""
Загружает файл на FTP-сервер

Args:
server (str): Адрес FTP-сервера
username (str): Имя пользователя
password (str): Пароль
local_path (str): Путь к локальному файлу
remote_path (str): Путь для сохранения на сервере
"""
try:
# Подключение к серверу
with ftplib.FTP(server) as ftp:
ftp.login(username, password)

# Открытие локального файла для чтения
with open(local_path, 'rb') as local_file:
# Загрузка файла
ftp.storbinary(f'STOR {remote_path}', local_file)

print(f"Файл успешно загружен: {remote_path}")
return True

except Exception as e:
print(f"Ошибка при загрузке файла: {str(e)}")
return False

# Пример использования
upload_file('ftp.example.com', 'user', 'password', 
'data.xlsx', '/upload/data.xlsx')

Для работы с текстовыми файлами существуют методы retrlines() и storlines(), но на практике retrbinary() и storbinary() подходят для всех типов файлов. Главное отличие в том, как вы открываете локальный файл (в бинарном или текстовом режиме).

При загрузке больших файлов полезно отслеживать прогресс передачи. Для этого можно создать обертку над функцией записи файла:

Python
Скопировать код
def download_with_progress(server, username, password, remote_path, local_path):
"""Скачивает файл с отображением прогресса"""

# Получение размера файла
def get_file_size():
ftp = ftplib.FTP(server)
ftp.login(username, password)
ftp.sendcmd("TYPE I") # Переключение в бинарный режим
size = ftp.size(remote_path)
ftp.quit()
return size

try:
total_size = get_file_size()
downloaded = 0

# Функция для отслеживания прогресса
def callback(data):
nonlocal downloaded
downloaded += len(data)
percent = (downloaded / total_size) * 100
print(f"\rПрогресс: {percent:.2f}% ({downloaded}/{total_size})", end="")
return file.write(data)

with ftplib.FTP(server) as ftp:
ftp.login(username, password)
with open(local_path, 'wb') as file:
ftp.retrbinary(f'RETR {remote_path}', callback)

print("\nЗагрузка завершена")
return True

except Exception as e:
print(f"\nОшибка: {str(e)}")
return False

Для работы с каталогами и рекурсивной загрузкой всех файлов пригодится следующая функция:

Python
Скопировать код
import os

def download_directory(ftp, remote_dir, local_dir):
"""Рекурсивно скачивает директорию с FTP-сервера"""

# Создаем локальную директорию, если она не существует
if not os.path.exists(local_dir):
os.makedirs(local_dir)

# Запоминаем текущую директорию на сервере
initial_dir = ftp.pwd()

try:
# Переходим в указанную директорию
ftp.cwd(remote_dir)

# Получаем список файлов
files = []
ftp.dir(files.append)

# Обрабатываем каждый элемент
for item in files:
# Парсинг вывода команды dir
tokens = item.split()
file_name = tokens[-1]

# Пропускаем специальные директории
if file_name in ('.', '..'):
continue

local_path = os.path.join(local_dir, file_name)

# Проверяем, директория это или файл
if item.startswith('d'): # Директория
download_directory(ftp, file_name, local_path)
else: # Файл
with open(local_path, 'wb') as f:
ftp.retrbinary(f'RETR {file_name}', f.write)
print(f"Скачан файл: {local_path}")

finally:
# Возвращаемся в исходную директорию
ftp.cwd(initial_dir)

Мария Соколова, Data Engineer В моей практике был случай, когда клиент — крупная торговая сеть — ежедневно получал от поставщиков десятки CSV-файлов с данными о товарах. Сотрудники вручную скачивали эти файлы с разных FTP-серверов, объединяли их и загружали в корпоративное хранилище данных. На это уходило 3-4 часа ежедневно. Я разработала Python-скрипт с использованием ftplib, который подключался к 17 различным FTP-серверам, идентифицировал новые файлы, скачивал их, обрабатывал и загружал в хранилище. Особенно сложной была обработка разнородных форматов и кодировок от разных поставщиков. После внедрения решения процесс стал полностью автоматическим и занимал 15 минут вместо 4 часов. Но самое интересное произошло через месяц — мы обнаружили, что скрипт выявил несоответствия в данных, которые сотрудники просто не замечали при ручной обработке. Это позволило предотвратить ошибки в ценообразовании и сэкономить компании значительные средства. Проект, задуманный как автоматизация рутины, превратился в инструмент контроля качества данных.

Автоматизация FTP-операций: пакетная обработка и планирование

Реальная мощь Python для работы с FTP проявляется при автоматизации повторяющихся задач. Объединив ftplib с другими возможностями Python, можно создать полностью автоматические процессы передачи файлов. 🤖

Рассмотрим сценарий автоматизированной синхронизации локальной директории с FTP-сервером:

Python
Скопировать код
import os
import ftplib
import datetime

def sync_directory(local_dir, ftp_server, username, password, remote_dir):
"""
Синхронизирует локальную директорию с FTP-сервером,
загружая только новые или измененные файлы
"""
# Подключаемся к серверу
ftp = ftplib.FTP(ftp_server)
ftp.login(username, password)

# Переходим в удаленную директорию
try:
ftp.cwd(remote_dir)
except ftplib.error_perm:
# Директория не существует, создаем
ftp.mkd(remote_dir)
ftp.cwd(remote_dir)

# Получаем список файлов на сервере и их даты изменения
remote_files = {}
try:
# Для некоторых серверов нужно использовать специальный формат даты
ftp.sendcmd('MDTM')
support_mdtm = True
except ftplib.error_perm:
support_mdtm = False

if support_mdtm:
for filename in ftp.nlst():
try:
# Получение времени модификации файла
timestamp = ftp.sendcmd(f'MDTM {filename}')
remote_files[filename] = timestamp
except ftplib.error_perm:
# Вероятно, это директория
pass

# Перебираем локальные файлы
for root, _, files in os.walk(local_dir):
for filename in files:
local_path = os.path.join(root, filename)

# Определяем относительный путь
rel_path = os.path.relpath(local_path, local_dir)

# Проверяем, есть ли файл на сервере
upload_file = False

if rel_path not in remote_files:
upload_file = True
elif support_mdtm:
# Сравниваем даты, если поддерживается
local_time = os.path.getmtime(local_path)
local_time = datetime.datetime.fromtimestamp(local_time)
# Конвертация в формат FTP
# ...код конвертации...
upload_file = True # Для примера всегда загружаем
else:
# Если нельзя проверить дату, загружаем всегда
upload_file = True

if upload_file:
print(f"Загрузка файла: {rel_path}")
with open(local_path, 'rb') as file:
ftp.storbinary(f'STOR {rel_path}', file)

ftp.quit()
print("Синхронизация завершена")

Для регулярного запуска такого скрипта можно использовать планировщики задач операционной системы (cron в Linux или Task Scheduler в Windows). Но Python предлагает и встроенные средства планирования задач, например, библиотеку schedule:

Python
Скопировать код
import schedule
import time

def daily_sync():
"""Функция для ежедневной синхронизации"""
print(f"Запуск синхронизации: {datetime.datetime.now()}")
sync_directory(
local_dir="/path/to/local/files",
ftp_server="ftp.example.com",
username="user",
password="pass",
remote_dir="/backup"
)

# Планирование ежедневного запуска в 2:00
schedule.every().day.at("02:00").do(daily_sync)

# Запуск планировщика
while True:
schedule.run_pending()
time.sleep(60) # Проверка каждую минуту

Для более сложных сценариев автоматизации полезно включить обработку различных файлов в зависимости от их типа:

Python
Скопировать код
def process_and_upload(local_dir, ftp_server, username, password):
"""Обрабатывает файлы разных типов и загружает их на FTP-сервер"""

# Подключение к серверу
ftp = ftplib.FTP(ftp_server)
ftp.login(username, password)

# Перебор файлов в директории
for filename in os.listdir(local_dir):
file_path = os.path.join(local_dir, filename)

# Пропускаем директории
if os.path.isdir(file_path):
continue

# Определяем тип файла по расширению
_, ext = os.path.splitext(filename)
ext = ext.lower()

# Обработка в зависимости от типа
processed_file = None

if ext == '.csv':
# Обработка CSV (например, конвертация в JSON)
processed_file = process_csv(file_path)
upload_path = f"/processed/json/{os.path.basename(processed_file)}"

elif ext in ('.jpg', '.png', '.gif'):
# Обработка изображений (например, изменение размера)
processed_file = process_image(file_path)
upload_path = f"/processed/images/{os.path.basename(processed_file)}"

elif ext == '.log':
# Обработка лог-файлов (например, сжатие)
processed_file = compress_log(file_path)
upload_path = f"/processed/logs/{os.path.basename(processed_file)}"

else:
# Для остальных файлов просто загружаем без обработки
processed_file = file_path
upload_path = f"/raw/{filename}"

# Загрузка файла
if processed_file:
with open(processed_file, 'rb') as file:
ftp.storbinary(f'STOR {upload_path}', file)
print(f"Файл {filename} обработан и загружен как {upload_path}")

ftp.quit()

Важный аспект автоматизации – мониторинг и уведомления. Можно добавить отправку email-уведомлений о результатах операций:

Python
Скопировать код
import smtplib
from email.mime.text import MIMEText

def send_notification(subject, message, recipient):
"""Отправляет email-уведомление"""
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = 'ftp-monitor@example.com'
msg['To'] = recipient

try:
smtp = smtplib.SMTP('smtp.example.com')
smtp.send_message(msg)
smtp.quit()
print("Уведомление отправлено")
except Exception as e:
print(f"Ошибка отправки уведомления: {str(e)}")

Интегрируя эту функцию в наш автоматизированный скрипт, мы получаем полноценное решение для мониторинга FTP-операций:

Python
Скопировать код
def automated_ftp_job():
"""Полная автоматизированная задача с уведомлениями"""
start_time = datetime.datetime.now()
success_count = 0
error_count = 0
log_messages = []

try:
# Выполнение основной работы
# ... код синхронизации ...

# Подготовка отчета
end_time = datetime.datetime.now()
duration = (end_time – start_time).total_seconds()

message = f"""
FTP-синхронизация завершена.
Время начала: {start_time}
Время окончания: {end_time}
Продолжительность: {duration} секунд
Успешно: {success_count} файлов
Ошибки: {error_count} файлов

Детали:
{''.join(log_messages)}
"""

send_notification("FTP Sync Report", message, "admin@example.com")

except Exception as e:
send_notification(
"FTP Sync Failed", 
f"Ошибка синхронизации: {str(e)}", 
"admin@example.com"
)

Обработка ошибок и безопасность при работе с FTP в Python

При работе с сетевыми протоколами обработка ошибок и безопасность становятся критически важными. FTP-соединения могут прерываться по различным причинам: нестабильная сеть, таймауты, проблемы с правами доступа. Грамотная обработка исключений гарантирует надежность ваших скриптов. 🔒

Основные типы исключений при работе с ftplib:

  • ftplib.error_reply – неожиданный ответ сервера
  • ftplib.error_temp – временная ошибка (код 4xx)
  • ftplib.error_perm – постоянная ошибка (код 5xx)
  • ftplib.error_proto – ошибка протокола
  • socket.error – ошибки сокетов (таймауты, разрывы соединения)

Рассмотрим пример надежного подключения к FTP с обработкой различных типов ошибок:

Python
Скопировать код
import ftplib
import socket
import time
import logging

# Настройка логгера
logging.basicConfig(
filename='ftp_operations.log',
level=logging.INFO,
format='%(asctime)s – %(levelname)s – %(message)s'
)

def robust_ftp_operation(max_retries=3, retry_delay=5):
"""Декоратор для повторных попыток FTP-операций при ошибках"""
def decorator(func):
def wrapper(*args, **kwargs):
retries = 0
while retries < max_retries:
try:
return func(*args, **kwargs)
except ftplib.error_temp as e:
# Временная ошибка – можно повторить
logging.warning(f"Временная ошибка FTP: {str(e)}. Попытка {retries+1}/{max_retries}")
retries += 1
if retries < max_retries:
time.sleep(retry_delay)
except ftplib.error_perm as e:
# Постоянная ошибка – бессмысленно повторять
logging.error(f"Постоянная ошибка FTP: {str(e)}")
raise
except socket.timeout:
# Таймаут соединения
logging.warning(f"Таймаут FTP-соединения. Попытка {retries+1}/{max_retries}")
retries += 1
if retries < max_retries:
time.sleep(retry_delay)
except socket.error as e:
# Сетевая ошибка
logging.warning(f"Сетевая ошибка: {str(e)}. Попытка {retries+1}/{max_retries}")
retries += 1
if retries < max_retries:
time.sleep(retry_delay)
except Exception as e:
# Неожиданная ошибка
logging.error(f"Неожиданная ошибка: {str(e)}")
raise

# Если все попытки неудачны
logging.error(f"Превышено количество попыток ({max_retries})")
raise Exception(f"Превышено количество попыток ({max_retries})")
return wrapper
return decorator

Теперь можно применить этот декоратор к нашим FTP-функциям:

Python
Скопировать код
@robust_ftp_operation(max_retries=5, retry_delay=10)
def download_file_robust(server, username, password, remote_path, local_path):
"""Надежная функция загрузки файла с FTP с повторными попытками"""
with ftplib.FTP(server, timeout=30) as ftp:
ftp.login(username, password)
with open(local_path, 'wb') as local_file:
ftp.retrbinary(f'RETR {remote_path}', local_file.write)

logging.info(f"Файл успешно загружен: {remote_path} -> {local_path}")
return True

Безопасная передача данных через FTP требует использования шифрования. Протокол FTPS (FTP через SSL/TLS) поддерживается в Python через класс FTP_TLS:

Python
Скопировать код
import ssl
from ftplib import FTP_TLS

def secure_ftp_upload(server, username, password, local_path, remote_path):
"""Безопасная загрузка файла через FTPS с проверкой сертификата"""
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)

# Для работы с самоподписанными сертификатами (НЕ рекомендуется для продакшн)
# context.check_hostname = False
# context.verify_mode = ssl.CERT_NONE

ftps = FTP_TLS(context=context)
ftps.connect(server, 21)
ftps.login(username, password)
ftps.prot_p() # Включение защищенного режима данных

with open(local_path, 'rb') as file:
ftps.storbinary(f'STOR {remote_path}', file)

ftps.quit()
logging.info(f"Файл безопасно загружен: {local_path} -> {remote_path}")
return True

Уязвимость Риск Решение
Передача учетных данных в открытом виде Перехват логина/пароля Использование FTPS (FTP_TLS)
Хранение учетных данных в коде Компрометация при доступе к исходникам Использование переменных окружения или хранилищ секретов
Небезопасное хранение скачанных файлов Несанкционированный доступ к данным Правильные права доступа, шифрование на диске
Отсутствие проверки содержимого файлов Загрузка вредоносного кода Валидация типов файлов, антивирусная проверка

Важный аспект безопасности – безопасное хранение учетных данных. Никогда не храните пароли непосредственно в коде:

Python
Скопировать код
import os
from dotenv import load_dotenv

# Загрузка переменных окружения из файла .env
load_dotenv()

def secure_credentials():
"""Получение учетных данных из переменных окружения"""
ftp_host = os.getenv("FTP_HOST")
ftp_user = os.getenv("FTP_USER")
ftp_pass = os.getenv("FTP_PASS")

if not all([ftp_host, ftp_user, ftp_pass]):
raise ValueError("Не все учетные данные FTP заданы в переменных окружения")

return ftp_host, ftp_user, ftp_pass

Для защиты от MITM-атак (Man-in-the-Middle) рекомендуется проверять отпечаток сертификата сервера:

Python
Скопировать код
def verify_certificate(connection, cert, errno, depth, result):
"""Проверка сертификата сервера"""
if not result:
logging.warning(f"Ошибка проверки сертификата: {errno}")

# Проверка отпечатка сертификата
expected_fingerprint = "11:22:33:44:55:66:77:88:99:00:AA:BB:CC:DD:EE:FF"
cert_fingerprint = ":".join([f"{x:02X}" for x in cert.digest("sha1")])

if cert_fingerprint != expected_fingerprint:
logging.error(f"Несоответствие отпечатка сертификата! "
f"Ожидалось: {expected_fingerprint}, "
f"Получено: {cert_fingerprint}")
return False

return result

Для корпоративных сред важно логирование всех FTP-операций для аудита безопасности:

Python
Скопировать код
def audit_ftp_operation(operation_type, server, username, path, result):
"""Запись операции в журнал аудита"""
log_entry = {
"timestamp": datetime.datetime.now().isoformat(),
"operation": operation_type,
"server": server,
"username": username,
"path": path,
"result": "success" if result else "failure",
"ip_address": socket.gethostbyname(socket.gethostname())
}

# Запись в JSON-лог
with open('ftp_audit.json', 'a') as f:
f.write(json.dumps(log_entry) + "\n")

# Можно также отправить в централизованную систему мониторинга
# send_to_monitoring_system(log_entry)

Работа с FTP через Python – это классический пример того, как несколько строк кода могут заменить часы ручной работы. Изучив базовый синтаксис ftplib и приемы обработки ошибок, вы создадите скрипты, которые безотказно передают файлы, пока вы занимаетесь более важными задачами. Регулярно обновляйте свои знания о безопасности FTP и следите за новыми протоколами передачи данных – ведь даже технологии с 50-летней историей продолжают эволюционировать. А с полученными навыками автоматизации вы не просто экономите время – вы превращаете хаос данных в управляемую систему.

Загрузка...