Перейти к содержимому

mc — консольный клиент S3

S3-хранилища — стандарт де-факто для объектных бакетов, бэкапов и статики. Когда AWS CLI кажется избыточным, а веб-консоль неудобной, выручает MinIO Client (mc). Это консольный инструмент для любого S3-совместимого хранилища: MinIO, Yandex Cloud, AWS S3, Backblaze B2. Работает из коробки, не требует Python и настраивается за минуту.

Установка

Скачиваю бинарник и делаю исполняемым:

curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc \
  -o /usr/local/bin/mc && chmod +x /usr/local/bin/mc

Проверяю версию:

mc --version

Для macOS аналогично, через Homebrew:

brew install minio-stable/mc/mc
Примечание

mc — один статический бинарник без зависимостей. Прекрасно работает в контейнерах и на минимальных образах.

Добавление алиаса

Алиас — это именованное подключение к S3-эндпоинту. Без него каждая команда требует полного URL.

mc alias set myminio https://minio.example.com \
  AKIAIOSFODNN7EXAMPLE \
  wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

После этого myminio заменяет URL во всех командах. Список алиасов:

mc alias list
Подсказка

В production не храни ключи в истории команд. Используй переменные окружения: mc alias set prod ${S3_ACCESS_KEY} ${S3_SECRET_KEY} --api API-S3v4 и подставляй через env.

Для S3-совместимых сервисов с самоподписанными сертификатами:

mc alias set myminio https://minio.example.com \
  minioadmin minioadmin --api S3v4 --insecure

Просмотр и навигация

Вывести список бакетов:

mc ls myminio

Рекурсивный листинг с содержимым:

mc ls --recursive myminio/backups/

Информация об объекте:

mc stat myminio/backups/db-2024-01.sql.gz
Предупреждение

mc ls без --recursive показывает только бакеты верхнего уровня. Для навигации по папкам внутри бакета используй префиксы.

Работа с бакетами

Создать бакет:

mc mb myminio/app-logs

Если бакет уже существует, mc сообщит об ошибке. Флаг --ignore-existing подавляет её:

mc mb --ignore-existing myminio/app-logs

Удалить пустой бакет:

mc rb myminio/app-logs

Для непустого бакета — с флагом force:

mc rb --force myminio/app-logs

Работа с объектами

Посмотреть содержимое объекта в stdout (не скачивая):

mc cat myminio/config/latest.yaml

Удалить объект:

mc rm myminio/backups/old.sql.gz

Рекурсивное удаление по маске:

mc rm --recursive --force myminio/temp/*
Примечание

mc rm без --force запрашивает подтверждение. В скриптах всегда используй --force.

Найти объекты по критерию:

mc find myminio --name "*.log" --older-than 30d

Комбинация с удалением:

mc find myminio --name "*.tmp" --exec "mc rm {path}" {}

Загрузка и выгрузка файлов

Скопировать локальный файл в бакет:

mc cp /tmp/dump.sql myminio/backups/

Множественная загрузка:

mc cp ./uploads/* myminio/static/

Скачать объект локально:

mc cp myminio/backups/latest.tar.gz /tmp/

Скопировать между бакетами (или между алиасами):

mc cp myminio/archive/2024/ mys3/backup-2024/ --recursive

Флаги для управления потоком:

ФлагНазначение
--recursiveОбработать директории рекурсивно
--forceПерезаписать без вопросов
--preserveСохранить атрибуты файла (mtime, ACL)
--if-not-existsПропустить уже существующие объекты
--disable-multipartЗагрузить одним PUT-запросом

Зеркалирование

Односторонняя синхронизация директорий:

mc mirror /data/myminio/uploads

С флагами для прода:

mc mirror --overwrite --delete \
  /data/myminio/uploads
ФлагНазначение
--overwriteПерезаписать изменившиеся файлы
--deleteУдалить в приёмнике файлы, отсутствующие в источнике
--watchРежим отслеживания изменений в реальном времени
--md5Проверять MD5 после загрузки
Предупреждение

--delete опасен: удалит файлы в приёмнике, которых нет в источнике. Тестируй с --dry-run или с флагом --preserve для резервных копий.

Dry-run — показать, что будет сделано, без изменений:

mc mirror --overwrite --delete --dry-run \
  /data/myminio/uploads

Политики доступа

Установить публичный доступ на бакет:

mc anonymous set download myminio/public

Типовые политики:

# Только чтение для всех
mc anonymous set download myminio/public

# Полный публичный доступ
mc anonymous set public myminio/public

# Приватный (только по ключам)
mc anonymous set private myminio/private

# Запретить листинг, разрешить скачивание по точной ссылке
mc anonymous set uploadOnly myminio/uploads

Посмотреть текущую политику:

mc anonymous list myminio

Сгенерировать пресигненную ссылку (работает и для приватных бакетов):

mc share download --expire 48h \
  myminio/backups/db-2024-01.sql.gz

Вывод содержит URL с подписью и время жизни.

Полезные флаги

Глобальные флаги, работающие для любой команды:

ФлагНазначение
--debugПодробный вывод HTTP-запросов и ответов
--jsonВывод в JSON (удобно для парсинга в скриптах)
--no-colorОтключить цветной вывод
--insecureНе проверять TLS-сертификат
--config-dirПуть к конфигурации (по умолчанию ~/.mc)
--limitОграничить скорость (например, --limit 10MiB/s)

JSON-вывод для автоматизации:

mc ls --json myminio | jq -r '.key'

Прогресс при копировании больших файлов:

mc cp --progress large.iso myminio/backups/

Shell-completion

Автодополнение в bash/zsh экономит время:

# Bash
mc completion bash > /etc/bash_completion.d/mc

# Zsh
mc completion zsh > "${fpath[1]}/_mc"

# Fish
mc completion fish > ~/.config/fish/completions/mc.fish

После подключения набираешь mc и два раза Tab — видишь доступные команды и алиасы.


mc покрывает 90% задач при работе с S3. Для сложных сценариев (версионирование, жизненные циклы, шифрование) — API или Terraform-провайдер. Но базовые операции с бакетами и объектами закрываются этим инструментом быстрее, чем через любой SDK.