Как управлять файлами в облачном хранилище с помощью Rclone на Linux
Rclone — это бесплатная программа командной строки с открытым исходным кодом для управления файлами в облачных хранилищах, таких как Google Drive, Backblaze B2, Amazon S3 и многих других. Приложение написано на языке программирования Go, а его исходный код размещен на GitHub. В этом руководстве мы узнаем, как установить Rclone на наиболее часто используемые дистрибутивы Linux и как выполнять основные операции, такие как копирование, синхронизация, перемещение и удаление данных. В процессе мы также увидим, как получить учетные данные API Google Диска и как настроить удаленный пульт Google Drive для Rclone.
В этом уроке вы узнаете:
- Как установить Rclone на некоторые из наиболее часто используемых дистрибутивов Linux
- Как получить учетные данные Google Drive API и настроить удаленный пульт Google Drive Rclone
- Как использовать Rclone для управления данными в облачном хранилище
Установка
Rclone доступен в официальных репозиториях всех основных дистрибутивов Linux. Чтобы установить программу на Fedora, выполняем:
sudo dnf install rclone
Эта же команда может быть использована для установки Rclone на RHEL, Rocky Linux и AlmaLinux, однако на этих дистрибутивах, прежде чем продолжить установку, нам необходимо добавить репозиторий EPEL в исходные коды системного программного обеспечения.
В Debian и дистрибутивах на основе Debian мы устанавливаем Rclone с помощью apt:
sudo apt install rclone
Rclone также доступен в репозитории Archlinux "extra"; Мы можем установить пакет с Pacman:
sudo pacman -S rclone
Получение учетных данных API для Google Диска
Для этого урока мы будем использовать Google Drive в качестве тестового облачного хранилища для Rclone. Несмотря на то, что можно использовать нативные учетные данные API Google Диска Rclone, они являются общими для всех пользователей Rclone и имеют ограниченное количество запросов в секунду. Чтобы обеспечить работоспособность, мы можем захотеть создать свой собственный.
Чтобы получить учетные данные Google Диска, мы получаем доступ к Google Cloud Console и добавляем новый проект. Нажимаем на выпадающее меню "Выбрать проект", а затем на "Новый проект":
Нам нужно выбрать название для нашего проекта. Здесь мы просто используем "rclone":
Как только все будет готово, нажимаем на кнопку «создать». Проект будет создан со случайно сгенерированным идентификатором. Чтобы выбрать наш проект, мы, еще раз, нажимаем на выпадающее меню "Выбрать проект". На этот раз, однако, мы выбираем проект, который только что создали:
В качестве следующего шага нам нужно добавить Google Drive API в наш проект. Ищем «Google Drive API», и нажимаем на первый результат:
Оказавшись на странице Google Drive API, мы активируем API, нажав на кнопку «Включить»; мы будем перенаправлены на страницу с подробной информацией о сервисе API. На этом этапе нажимаем на пункт «Учетные данные» в левом вертикальном меню:
Теперь нам нужно настроить экран согласия для нашего проекта, поэтому нажимаем на кнопку "Настроить экран согласия":
В качестве типа пользователя выбираем «Внешний», затем нажимаем на кнопку «Создать»:
На следующей странице мы должны предоставить информацию о нашем приложении. Как минимум, мы должны ввести «Название приложения», адрес электронной почты службы поддержки пользователя и контактную информацию разработчика. Когда все будет готово, нажимаем на кнопку "Сохранить и продолжить":
Далее нам нужно выбрать, какие области мы назначим нашему приложению. В основном это привилегии, которые приложение будет иметь в хранилище Google Drive. Чтобы добавить область видимости, мы нажимаем на кнопку "Добавить или удалить области", затем, чтобы убедиться, что Rclone способен выполнять все типы операций, мы выбираем .. /auth-docs
, .. /auth-drive
, и .. /auth/drive.metadata.readтолько
:
После этого мы нажимаем на кнопку «Обновить», а затем на «Сохранить и продолжить». Теперь нам нужно добавить собственную учетную запись в качестве тестового пользователя. Нажимаем на кнопку «Добавить пользователей» и вводим адрес электронной почты, который хотим использовать. Когда закончите, нажимаем на кнопку "Добавить", затем, еще раз, на "Сохранить и продолжить":
На следующей странице мы сможем ознакомиться со сводкой настроек приложения. На этом этапе нам нужно снова нажать на пункт «Учетные данные» в левом вертикальном меню. Оказавшись на странице учетных данных, мы нажимаем на «Создать учетные данные», а затем на «Идентификатор клиента OAuth»:
На следующей странице мы выбираем "Десктопное приложение" в качестве типа приложения. Мы можем оставить автоматически сгенерированное имя клиента. Когда все будет готово, нажимаем на кнопку "Создать":
Учетные данные OAuth будут созданы. Мы должны записать их (в любом случае, мы можем легко получить их позже со страницы "Учетные данные"):
В качестве последнего шага мы нажимаем на экран согласия OAuth в левом вертикальном меню, затем на кнопку «Опубликовать приложение»:
Теоретически мы должны подготовить и отправить приложение в Google для проверки, однако мы в любом случае должны иметь возможность использовать «приложение». Теперь, когда у нас есть собственные учетные данные Google Drive API, мы можем увидеть, как настроить удаленный Rclone.
Создание конфигурации Rclone на Google Диске
Самый простой способ создать удаленную конфигурацию Google Drive для Rclone — использовать пошаговую настройку. Чтобы запустить «мастер», запускаем:
rclone config
Rclone попросит нас выбрать действие. Выбираем "n" для создания нового пульта:
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Мы должны дать название для "удаленки". В данном случае мы просто используем "gdrive":
name> gdrive
Далее нам нужно выбрать подходящее облачное хранилище из списка. Точное положение Google Drive в списке может отличаться. В последних версиях на Rclone это должно быть 18:
Storage> 18
На этом этапе нам нужно ввести учетные данные Google Drive, которые мы сгенерировали на предыдущем шаге:
client_id> <your-client-id-here>
client_secret> <your-client-secret-here>
После ввода наших учетных данных нам нужно выбрать области, которые Rclone должен использовать. В этом случае выбираем "1":
Choose a number from below, or type in your own value.
1 / Full access all files, excluding Application Data Folder.
\ "drive"
2 / Read-only access to file metadata and file contents.
\ "drive.readonly"
/ Access to files created by rclone only.
3 | These are visible in the drive website.
| File authorization is revoked when the user deauthorizes the app.
\ "drive.file"
/ Allows read and write access to the Application Data folder.
4 | This is not visible in the drive website.
\ "drive.appfolder"
/ Allows read-only access to file metadata but
5 | does not allow any access to read or download file content.
\ "drive.metadata.readonly"
scope> 1
В следующем запросе Rclone спрашивает нас, хотим ли мы использовать JSON-файл учетных данных сервисного аккаунта, мы можем оставить поле пустым и просто нажать "Enter":
Option service_account_file.
Service Account Credentials JSON file path.
Leave blank normally.
Needed only if you want use SA instead of interactive login.
Leading `~` will be expanded in the file name as will environment variables such as `${RCLONE_CONFIG_DIR}`.
Enter a value. Press Enter to leave empty.
service_account_file>
Мы также можем пропустить редактирование расширенной конфигурации:
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Далее нам нужно выбрать, хотим ли мы использовать приглашение браузера для аутентификации Rclone с помощью нашего приложения Google Drive. Отвечаем утвердительно:
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes (default)
n) No
y/n> y
Как только мы нажмем Enter, откроется вкладка браузера. Как мы уже говорили ранее, мы увидим предупреждение, так как приложение не проверено Google. Чтобы продолжить аутентификацию, нажимаем на "Дополнительно", а затем на "Перейти к rclone (unsafe)":
Мы должны подтвердить, что хотим предоставить приложению запрошенные привилегии. Для подтверждения нажимаем на кнопку "Продолжить":
Вернувшись в терминал, мы можем выбрать, хотим ли мы настроить общий диск. В этом случае мы можем дать отрицательный ответ:
Configure this as a Shared Drive (Team Drive)?
y) Yes
n) No (default)
y/n> n
Наконец, чтобы подтвердить и сохранить пульт дистанционного управления, мы отвечаем утвердительно на последний вопрос:
Keep this "gdrive" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Чтобы выйти из мастера, в последнем запросе выбираем "q":
Актуальные пульты дистанционного управления:
Name Type
==== ====
gdrive drive
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
Использование rclone
Rclone предоставляет множество команд, которые мы можем использовать для управления данными в облачном хранилище. Здесь мы не можем предоставить подробный список, но мы можем увидеть, как выполнять основные операции, такие как копирование, синхронизация, перемещение и удаление данных.
Вывод списка файлов и каталогов на удаленном сервере
Чтобы получить список файлов, которые в данный момент размещены в облачном хранилище, мы запускаем rclone с помощью команды ls
. Чтобы просмотреть файлы, доступные на удаленном пульте Google Диска, мы выполним:
rclone ls gdrive:/
Команда возвращает следующие выходные данные:
37 file1.txt
5 file0.txt
Как видите, на Google Диске размещены только два файла: file1.txt и file0.txt: их размер указан в начале строки, в байтах. Чтобы получить больше информации о каждом файле, мы можем использовать команду lsl
, которая возвращает также время модификации:
rclone lsl gdrive:
37 2024-05-24 14:56:03.931000000 file1.txt
5 2024-05-24 14:55:55.889000000 file0.txt
Обе команды ls
и lsl
работают рекурсивно, поэтому они перечисляют файлы, также содержащиеся в подкаталогах, но не включают каталоги в свой вывод. Чтобы получить список каталогов, существующих на удаленном репозитории, мы используем команду lsd
:
rclone lsd gdrive:
-1 2024-05-24 15:47:24 -1 mydir
В отличие от ls
и lsl
, lsd
работает безотказно, если только мы не используем опцию -R
:
rclone lsd -R gdrive:
-1 2024-05-24 15:47:24 -1 mydir
-1 2024-05-24 15:52:41 -1 mydir/one
Чтобы получить список файлов и директорий и получить легко разбираемый вывод, пригодный для использования в скриптах, мы можем использовать две другие команды: lsf
и lsjson
. Оба они работают нерекурсивно; Первый возвращает только имена файлов и каталогов, по одному в строке:
rclone lsf gdrive:
file0.txt
file1.txt
mydir/
Последний, вместо этого, возвращает вывод в формате JSON:
[
{"Path":"file0.txt","Name":"file0.txt","Size":5,"MimeType":"text/plain","ModTime":"2024-05-24T12:55:55.889Z","IsDir":false,"ID":"1keyQCpqiyQbiF6FWUjR4Mb2petECgFkE"},
{"Path":"file1.txt","Name":"file1.txt","Size":37,"MimeType":"text/plain","ModTime":"2024-05-24T12:56:03.931Z","IsDir":false,"ID":"1Aia5gGkvGEe40BlXQah7g3DZWjnCkxxJ"},
{"Path":"mydir","Name":"mydir","Size":-1,"MimeType":"inode/directory","ModTime":"2024-05-24T13:47:24.355Z","IsDir":true,"ID":"1qR6DF7ybJ29ghcUowvqiBowfxDNQf7yg"}
]
Копирование файлов и каталогов
Чтобы скопировать файлы из удаленного хранилища и в него, мы используем команду copy
. Предположим, мы хотим скопировать file0.txt из Google Drive в текущую рабочую директорию на localhost; мы выполним:
rclone copy gdrive:/file0.txt .
Таким же образом мы можем скопировать директорию, но мы должны помнить, что Rclone копирует содержимое директории, а не саму директорию. Кроме того, он пропускает копирование пустых подкаталогов, если только мы не используем опцию --create-empty-src-dirs
.
При использовании копирования создаются файлы, существующие в источнике, которые не существуют в месте назначения, а существующие файлы обновляются. Иногда мы хотим изменить это поведение таким образом, чтобы существующие файлы в месте назначения остались нетронутыми. Распространенным случаем является копирование резервной копии из локального репозитория в удаленный, чтобы избежать распространения возможных повреждений старых снимков. Для реализации такого поведения мы можем использовать опцию --immutable
: это приводит к сбою операции копирования, если она подразумевает изменение существующих файлов на месте назначения (обратите внимание, однако, что на момент написания статьи это не работает при копировании отдельных файлов! – см. эту открытую ошибку в репозитории Rclone на GitHub).
Перемещение и переименование файлов и каталогов
Для перемещения файлов мы используем команду move
. Предположим, мы хотим переместить file0.txt
с удаленного компьютера на наш локальный хост. Мы бы запустили:
rclone move gdrive:/file0.txt .
Поскольку это потенциально деструктивная операция, мы можем сначала запустить команду с опцией --dry-run
, которая просто имитирует операцию.
Если мы хотим переименовать файл, мы используем команду moveto
. Предположим, что мы хотим переименовать file0.txt
в file00.txt
на удаленном репозитории; мы выполним:
rclone moveto gdrive:/file0.txt gdrive:/file00.txt
Эту же команду можно использовать, если мы хотим загрузить файл, но сохранить его под другим именем:
rclone moveto file0.txt gdrive:/file00.txt
Синхронизация каталогов с помощью команды sync
Еще одна команда, которую мы можем использовать для копирования данных из удаленного хранилища и в удаленное хранилище, — это синхронизация
. Основное различие между синхронизацией
и копированием
заключается в том, что первая создает зеркальную копию источника для назначения. Другими словами, файлы, которые существуют в источнике, но не в месте назначения, копируются, а измененные файлы обновляются. Кроме того, удаляются файлы, которые не существуют в источнике, но присутствуют в месте назначения.
Предположим, что мы хотим синхронизировать содержимое локального каталога mydir
с тем же каталогом на удаленном сервере (он создается, если его не существует); мы бы выполнили:
rclone sync mydir gdrive:/mydir
Вы легко поймете, почему эту команду нужно использовать с осторожностью. Можно использовать опцию --imutable
также при использовании команды sync
; это приведет к тому, что команда откажется обновлять измененные файлы, в то время как она все еще сможет удалять файлы в месте назначения, которые не существуют в источнике.
Удаление файлов и каталогов
Для удаления файлов и каталогов мы можем использовать команду delete
. Предположим, что мы хотим удалить файл file0.txt
на удаленном репозитории, мы выполним:
rclone delete gdrive:/file0.txt
Когда мы используем команду delete
против каталога, удаляется только содержимое каталога, в то время как сам каталог остается на месте. Если директория содержит поддиректории, они также останутся нетронутыми, если только мы не используем опцию --rmdirs
(корневой каталог все равно будет сохранен).
Чтобы удалить все, кроме некоторых файлов в каталоге, мы можем указать шаблон в качестве аргумента опции --exclude
. Чтобы удалить все файлы в директории "mydir", кроме файлов с расширением ".txt", например, мы выполним:
rclone delete --exclude=*.txt gdrive:/mydir
Файлы также можно фильтровать в зависимости от их размера и других параметров. Просто в качестве примера, чтобы удалить только файлы >= 100 МиБ, мы выполним:
rclone delete --min-size=100MiB gdrive:/mydir
Чтобы гарантировать, что мы удаляем только отдельные файлы, мы можем использовать команду deletefile
. Наконец, чтобы удалить каталог вместе с его содержимым, мы можем использовать команду очистки
:
rclone purge gdrive:/mydir
По умолчанию удаленные файлы и директории перемещаются в корзину Google Drive: чтобы удалить файл, минуя корзину, мы можем использовать опцию --drive-use-trash=false
. Для вывода списка уничтоженных файлов мы используем команду ls
с опцией --drive-trashed-only
. Наконец, чтобы очистить корзину, мы используем команду cleanup
:
rclone cleanup gdrive:/
Монтирование удаленного хранилища в качестве файловой системы
Rclone может монтировать удаленное хранилище в качестве сетевого диска, используя fuse (файловую систему в пользовательском пространстве). В нашем случае, чтобы смонтировать удаленный пульт "gdrive" в каталоге ~/Public
, мы должны выполнить:
rclone mount gdrive:/ ~/Public
При запуске на переднем плане команда блокирует терминал до тех пор, пока пульт дистанционного управления смонтирован. Чтобы размонтировать файловую систему, мы можем просто нажать CTRL-c или явно отправить сигнал SIGINT или SIGTERM процессу.
Заключение
В этом руководстве мы рассмотрели, как установить Rclone на некоторые из наиболее часто используемых дистрибутивов Linux и как использовать его для выполнения основных операций на удаленном хранилище. В процессе работы мы узнали, как получить учетные данные API Google Диска и как создать удаленную конфигурацию Google Диска для Rclone. С помощью Rclone можно сделать гораздо больше, чем мы говорили в этой статье; Чтобы узнать больше обо всех доступных командах и их опциях, пожалуйста, загляните на официальный сайт проекта, или запустите каждую команду с опцией -h
.