Найти тему

Отправка файлов на Google Drive из Linux

Задача

Не так давно для моего проекта потребовалось настроить автоматическую выгрузку бэкапов на Google Drive из ОС Linux. Официального клиента от Google для Linux нет, и как оказалось будет он нескоро. Поэтому я начал изучать существующие неофициальные решения и понял, что многие из них не работают при действующей политики безопасности Google. Т.е. при авторизации приложение блокировалось, и даже поставленная галочка в настройках аккаунта, разрешающая авторизацию через ненадежные приложения, не помогала.

Ошибка при попытке авторизации
Ошибка при попытке авторизации

Rclone

После пары часов изучения существующих клиентов, наткнулся на программу Rclone. Она позволяет делать авторизацию не только через аккаунт Google, но и через ID и Secret Key приложения, созданного в Google Cloud Platform. Это решение мне показалось самым оптимальным, и я решил попробовать его реализовать.

Получение ID и Secret Key

1. Создайте проект в Google Cloud Platform

-2

2. Перейдите на вкладку APIs & Services => Credentials => Create credentials. Выберите пункт OAuth Client ID. В качестве типа приложения выбирайте Веб-приложение.

После этого вы получите заветные Client ID и Secret Key.

Настройка Rclone

Установите Rclone
apt install rclone

И перейдите к настройке
rclone config

Введите n для создания нового соединения

No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n

Даем название и выбираем тип сервиса Google Drive и вводим 15

13 / FTP Connection
\ "ftp"
14 / Google Cloud Storage (this is not Google Drive)
\ "google cloud storage"
15 / Google Drive
\ "drive"
16 / Google Photos
\ "google photos"
17 / Hadoop distributed file system
\ "hdfs"

Далее указываем client_id и client_secret. Выбираем права доступа к диску

Scope that rclone should use when requesting access from drive.
Enter a string value. Press Enter for the default ("").
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"

Далее выбираем настройки для следующих пунктов по умолчанию

root_folder_id>
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 string value. Press Enter for the default ("").
service_account_file>
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
Use auto config?
* Say Y if not sure * Say N if you are working on a remote or headless machine
y) Yes (default)
n) No
y/n> y

После этого вам будет предложено перейти по ссылке

If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=some_code
Log in and authorize rclone for access
Waiting for code...

Просто открываете её с того компьютера, с которого подключились по ssh к серверу, и даете разрешение на работу с диском.

Отправка данных

Полный список команд можно получить через --help, поэтому приведу только список основных:

rclone mkdir google-drive:[folder] - создание папки в облаке
rclone copy [local-src] google-drive:[folder] - копирование в облако
rclone copy google-drive:[folder] [local-src] - копирование в локальную папку
rclone sync [local-src] google-drive:[folder] - синхронизация с облаком приоритет на локальной папке
rclone sync google-drive:[folder] [local-src] - синхронизация с облаком приоритет на облако
rclone lsd google-drive: - показать созданные [folder]
rclone ls google-drive:[folder] - показать файлы в [folder]