LinuxでGoogle Driveを操作(rcloneの使い方)

概要

  • RHEL8.3にて、rcloneを使用してGoogle Driveに接続する方法を説明します。

    Rclone syncs your files to cloud storage: Google Drive, S3, …

  • REHL8.3(64ビット)+rclone v1.55.0-DEVを使用する前提です。
  • Googleアカウントを取得し、Google Driveを使用できる前提です。
  • 後述の「使用方法」では、簡単に使ってみる前提でクライアントIDとシークレットを指定していません。結果として、rcloneの既定のクライアントIDを使用することになりますが、このIDはrcloneユーザで共有されており、Googleから同時実行数や帯域の制限等を受けます。詳細は公式サイトをご覧ください。
  • 実際に運用する場合は、参考の「Googleへのクライアントの登録方法」にある手順でGoogleにあなた用のクライアントを登録し、そのクライアントIDとシークレットを指定する必要があります。
  • なお、同様のツールであるgdriveをこちらで紹介していますが、現状ではお薦めできません。
    NDW

    2020年現在、認証時にGoogleにブロックされることや、ツールのメンテナンスが終了していることもあり、rclone等…

使用方法

インストールと接続先登録

  1. rcloneのインストール
    RHEL8.3の場合は次のようにyumやdnfからインストールできます。公式サイトからバイナリをダウンロードすることもできます。

    # yum install rclone
  2. rcloneの設定初期化コマンドの実行
    rcloneを使用するユーザで次のコマンドを実行します。

    $ rclone config
  3. 接続先としてGoogle Driveの登録
    前述の設定初期化コマンドを実行すると条件の入力を求められるので、次のように順次入力していきます。
    お試しでなく実運用を想定している場合、独自のclient_id, client_secretの指定をおすすめします。詳細は「接続先としてGoogle Driveの登録(詳細)」をご覧ください。

    n/s/q> n("New remote"を選択)name> gd(任意の接続先名、コマンド実行時の接続先指定で使用)Storage> drive("Google Drive"を選択)client_id> (未指定)(rcloneの既定のクライアントIDを使用)client_secret> (未指定)(rcloneの既定のシークレットを使用)scope> 1(フルアクセス権限)root_folder_id> (未指定)(接続時の既定のフォルダ)service_account_file> (未指定)y/n> (未指定)(advanced configは不要)y/n> n(auto configは行わない)Please go to the following link: https://...(別途ブラウザで開いて認証を進める)Enter verification code> xxxxx(ブラウザに表示されたコードを張り付け)y/n> n(共有フォルダは構成しない)y/e/d> y(設定を保存)e/n/d/r/c/s/q> q(設定の終了)
  4. 動作確認
    Google Driveのフォルダ・ファイル一覧を取得してみます。

    $ rclone lsd gd:-1 2021-05-03 13:23:56  -1 testdir1
  5. (参考)設定内容の確認
    設定した内容は次のように確認できます。

    $ rclone config file(設定ファイルの保存場所確認)Configuration file is stored at:/home/anyuser/.config/rclone/rclone.conf$ rclone listremotes(登録済の接続先一覧取得)gd:$ rclone config delete xxx(接続先xxxの削除)$ rclone config dump(接続先情報の詳細取得){ "gd": {  "client_id": "...",  "client_secret": "...",  ... }}

コマンドの使用方法

ここでは基本的なコマンドの使い方を説明します。

  • rcloneの主要なコマンドはこちらをご覧ください。(全コマンドはこちら
  • これらのコマンドと併せて、接続先毎に用意されたオプションも指定できます。
    Google Drive用のオプションはこちらをご覧ください。
  • カレントディレクトリという考えはないようで、cd/chdir等のカレントディレクトリを変更するコマンドはありません。(絶対パスで指定する考えのようです。)
  • 一部のコマンド(sync, move, ls, lsl, md5sum, sha1sum, size, delete, checkや類似のもの)では、コマンドの対象や対象外を指定できるフィルタオプションも指定できます。

フォルダ・ファイル一覧の取得

  • 一覧取得系のコマンドは、ls/lsl/lsd/lsf/lsjsonがあります。
  • lsは、フォルダ・ファイルを再帰的に一覧表示します。
    $ rclone ls gd: -1 testfile1.docx 17 testdir1/subfile2.txt -1 testdir1/subfile.docx -1 testdir1/subdir/subdirfile.xlsx$ rclone ls gd:/testdir1/ --include "*file*"  1048576 testfile.dat 17 subfile2.txt -1 subfile.docx -1 subdir/subdirfile.xlsx
    • Google Docs系ファイルのサイズが”-1″になるのはGoogld Drive接続時の制約です。
    • このコマンドは空フォルダを表示しません。(他のlsdやlsfでは表示します。)
    • フィルタオプションを指定することで対象・対象外を絞り込むことができます。
  • lslは、フォルダ・ファイルを再帰的に一覧表示します。
    lsは異なり、更新日時も表示されます。(”ls -l”のイメージですかね。)

    $ rclone lsl gd:/testdir1 17 2021-05-03 14:21:26.042000000 subfile2.txt -1 2021-05-03 13:21:49.389000000 subfile.docx -1 2021-05-03 14:15:26.050000000 subdir/subdirfile.xlsx
  • lsdは、対象フォルダのフォルダ一覧(非再帰)を表示します。
    $ rclone lsd gd: -1 2021-05-03 13:23:56  -1 testdir1
  • lsflsjsonはスクリプトで処理しやすい書式で一覧(非再帰)を表示します。
    $ rclone lsf gd:/testdir1subdir/subdirempty/subfile.docxsubfile2.txt$ rclone lsjson gd:/testdir1[{"Path":"subdir","Name":"subdir","Size":-1,"MimeType":"inode/directory","ModTime":"2021-05-03T04:22:41.960Z","IsDir":true,"ID":"..."},{"Path":"subdirempty","Name":"subdirempty","Size":-1,"MimeType":"inode/directory","ModTime":"2021-05-03T09:36:13.160Z","IsDir":true,"ID":"..."},{"Path":"subfile.docx","Name":"subfile.docx","Size":-1,"MimeType":"application/vnd.openxmlformats-officedocument.wordprocessingml.document","ModTime":"2021-05-03T04:21:49.389Z","IsDir":false,"ID":"..."},{"Path":"subfile2.txt","Name":"subfile2.txt","Size":17,"MimeType":"text/plain","ModTime":"2021-05-03T05:21:26.042Z","IsDir":false,"ID":"..."}]
  • ls, lslは既定では再帰で一覧を出力しますが、--max-depth 1オプションで非再帰に変更できます。逆に、lsd,lsf,lsjsonは既定で非再帰で一覧を出力しますが、-Rオプションで再帰に変更できます。

ファイルのアップロード・ダウンロード

  • ファイルのアップロード・ダウンロードはcopycopytoコマンドを使用します。(copytoは宛先フォルダ・ファイル名にリネームする機能も含みます。)
  • どちらのコマンドもファイルのハッシュ値が同一の場合はコピーされません。
  • 複数のファイルをコピーする場合、--include, --min-size等のフィルタオプションを指定します。
  • アップロードの例を次に示します。
    $ rclone copy testfile.dat gd:/testdir1/$ rclone copy . gd:/testdir1/ --include "*.dat"
  • ダウンロードの例を次に示します。
    $ rclone copy gd:/testdir1/subfile.docx .$ ls -l合計 1032-rw-rw-r-- 1 xxx xxx 6112  5月  3 13:21 subfile.docx-rw-rw-r-- 1 xxx xxx 1048576  5月  3 20:51 testfile.dat$ rclone copy gd:/testdir1 . --min-size=3m --max-size=8m

ファイル削除

  • ファイルの削除はdeletefile、フォルダ・ファイルの削除にはdeletepurgeがあります。
    deleteはファイルまたは空フォルダを削除でき、フィルタオプションを指定することもできます。purgeは、フォルダに含まれるファイルも含め纏めて削除できますが、フィルタオプションを指定できません。
  • deleteの例を次に示します。
    $ rclone --dry-run delete gd:/testdir1/testfile.dat2021/05/03 21:20:38 NOTICE: testfile.dat: Skipped delete as --dry-run is set (size 1M)$ rclone --dry-run delete gd:/testdir1/notfound2021/05/03 21:23:59 ERROR : Attempt 1/3 failed with 1 errors and: directory not found2021/05/03 21:23:59 ERROR : Attempt 2/3 failed with 1 errors and: directory not found2021/05/03 21:24:00 ERROR : Attempt 3/3 failed with 1 errors and: directory not found2021/05/03 21:24:00 Failed to delete: directory not found$ rclone delete gd:/testdir1/testfile.dat$ rclone delete gd:/testdir1/ --min-size=10m
    • --dry-run deleteを指定することで試す(実際には削除しない)こともできます。
    • ブラウザのGoogle Driveではファイル拡張子が表示されません。削除対象の完全なファイル名を確認したい場合は前述のls等で確認できます。
    • フィルタオプションを指定することで対象・対象外を絞り込むことができます。

参考

接続先としてGoogle Driveの登録(詳細)

  1. 接続先の作成を選択する。
    $ rclone configNo remotes found - make a new onen) New remotes) Set configuration passwordq) Quit confign/s/q> n
  2. 接続先の名称を指定する。
    例えば「rclone lsd gd:」の"gd"のように接続先として使用する名前になるので、適度に短めの名称をお薦めします。

    name> gd
  3. 接続先としてGoogle Driveを指定する。
    Type of storage to configure.Enter a string value. Press Enter for the default ("").Choose a number from below, or type in your own value 1 / 1Fichier\ "fichier" 2 / Alias for an existing remote...15 / Google Drive\ "drive"...42 / seafile\ "seafile"Storage> drive** See help for drive backend at: https://rclone.org/drive/ **
  4. Google Drive接続時のアプリ情報を指定する。
    お試しで使用する場合、クライアントIDとシークレットは未指定で問題ありませんが、結果としてrcloneの既定のクライアントIDが使用されます。このクライアントIDはrcloneのユーザで共有されており、Googleから同時実行や帯域制限等の制約を受けます。詳細は公式サイトをご覧ください。
    実運用で使用する場合は後述のように独自にGoogleに対してクライアントを登録した後に、発行されたクライアントIDとシークレットをここで指定する必要があります。

    Google Application Client IdSetting your own is recommended.See https://rclone.org/drive/#making-your-own-client-id for how to create your own.If you leave this blank, it will use an internal key which is low performance.Enter a string value. Press Enter for the default ("").client_id> xxxxxxxxxxOAuth Client SecretLeave blank normally.Enter a string value. Press Enter for the default ("").client_secret> xxxxxxxxxx
  5. 接続時の権限(スコープ)を指定する。
    ここではファイルのアップロード・ダウンロード、削除等を想定しているため、フルアクセスの"1"を選択します。

    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"scope> 1
  6. 接続先のルートフォルダを指定する。
    指定する場合はフォルダIDをしています。ブラウザでGoogle Driveのフォルダを開いた際のURLに含まれるIDになります。("https://drive.google.com/drive/u/1/folders/1h6U...pVFr"の場合は、"1h6U...pVFr"の部分がフォルダIDになります。)

    ID of the root folderLeave blank normally.Fill in to access "Computers" folders (see docs), or for rclone to usea non root folder as its starting point.Enter a string value. Press Enter for the default ("").root_folder_id> (未指定)
  7. 認証情報の保存先を指定する。
    Service Account Credentials JSON file pathLeave 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> (未指定)
  8. 詳細な設定を行うかを指定する。
    Google Driveに接続する場合、詳細な設定は必要ありません。

    Edit advanced config? (y/n)y) Yesn) No (default)y/n> (未指定)
  9. アクセストークンの取得方法を選択します。
    • "auto config"は自動で検証コードを登録する機能です。
    • "y"を選択した場合、Linux上でブラウザが起動し、Googleの認証や同意画面が表示されます。認証や同意に成功した場合、発行された検証コードが自動的にrcloneの設定に保存されます。
    • "n"を選択した場合、URIが表示されるので、そのURIを自身でブラウザに張り付けて認証や同意する必要があります。成功した場合は検証コードが表示されるので、その内容をコピペする必要があります。
    • ここではCLIの使用を前提としているため、"n"を選択しています。
    Remote configUse auto config? * Say Y if not sure * Say N if you are working on a remote or headless machiney) Yes (default)n) Noy/n> nPlease go to the following link: https://accounts.google.com/o/oauth2/auth?...Log in and authorize rclone for accessEnter verification code> xxxxxxxxxxxxxxxxxxxxxxx
  10. 共有フォルダを構成するかを指定します。
    Configure this as a Shared Drive (Team Drive)?y) Yesn) No (default)y/n> n
  11. 設定内容を保存します。
    --------------------[gd]type = drivescope = drivetoken = {"access_token":"...",...}--------------------y) Yes this is OK (default)e) Edit this remoted) Delete this remotey/e/d> y
  12. 設定を終了します。
    Current remotes:Name  Type====  ====gd drivee) Edit existing remoten) New remoted) Delete remoter) Rename remotec) Copy remotes) Set configuration passwordq) Quit confige/n/d/r/c/s/q> q

Googleへのクライアントの登録方法

概要

Google Drive APIを有効化し、当該APIを使用するクライアントアプリケーションをGoogleに登録する方法を説明します。
登録した結果としてクライアントIDとシークレットが発行されるので、"rclone config"時のクライアントIDとシークレットに指定する必要があります。

  • アプリがGoogle Driveのデータにアクセスするためには、Google Drive APIを有効にする必要があります。
  • アプリがGoogle Drive APIを介してユーザのデータにアクセスするためには、Googleから発行されるアクセストークンが必要となります。
    • アクセストークンの発行は、OAuth2等の認証・認可の仕組みで行われます。
    • Googleがアプリにアクセストークンを発行するためには、大きく分けて次の条件が必要になります。
      1. 「当該アプリがユーザデータにアクセスする」ことをユーザが同意している
      2. Googleに当該アプリ(OAuth2クライアント)が登録されていること
        (Googleは、アプリから提示されたクライアントIDとシークレットでアプリを認証する。)
  • このような理由から、ここでは次の手順を実施します。
    1. Google Drive APIの有効化
    2. Googleがユーザに対して同意を得るための「OAuth2同意画面を構成」(上記のAに対応)
    3. Googleにアプリを登録するための「OAuth2クライアントの登録」(上記のBに対応)
  • 詳細は公式サイトをご覧ください。

登録手順

※Googleの画面キャプチャが著作権に触れるか不明のため文字だけの手順になります。

  1. Google API Consoleにログインする。
  2. プロジェクトの作成
    [プロジェクトを作成]をクリックする。
    任意のプロジェクト名を指定して[作成]をクリックする。
  3. Google Drive APIの有効化
    [APIとサービスの有効化]をクリックします。
    [Google Drive API]を選択し、[有効にする]をクリックする。
  4. OAuth2同意画面の構成
    1. 画面左メニューの[認証情報]をクリックし、[同意画面を構成]をクリックする。
    2. 表示された[OAuth同意画面]で、[外部]を選択し[作成]をクリックする。
      ※組織内ユーザは想定していないため[外部]を選択しています。
    3. 表示された[アプリ登録の編集]画面で、必須項目を入力し[保存して次へ]をクリックする。
      • アプリ名: rclone
      • ユーザーサポートメール: (googleアカウントに対応するメールアドレスを選択)
      • メールアドレス: (任意のメールアドレス)

      ※ここではテストではなく本番として公開する想定なので、途中の「テストユーザの追加」等のテスト用の設定は無視します。

    4. 画面左メニューの[OAuth同意画面]をクリックし、[公開ステータス]の[アプリを公開]をクリックする。
      (「Googleアカウントを持つ全てのユーザーがアプリを利用できるようにします。」を字面通りに読むと危険に思えるかもしれませんが、このアプリを使用するためにはこの後発行されるクライアントIDとシークレットを知る必要があるのと、そのアプリを介して認証したユーザのGoogleドライブが見えるようになるだけなので、実質的に自分しかアクセスできません。)
  5. OAuth2クライアントの登録
    1. 画面左メニューの[認証情報]をクリックし、[認証情報の作成]の[OAuthクライアントID」をクリックします。
    2. 表示された[OAuthクライアントIDの作成]画面で次を入力し、[作成]をクリックします。
      • [アプリケーションの種類]: [デスクトップアプリ]
      • [名前]: (任意)
    3. OAuthクライアントが作成され、クライアントIDとシークレットが表示されるので、どこかに控えます。
      (画面左メニューの[認証情報]の[OAuth2.0クライアントID]から対象のOAuthクライアントをクリックして、クライアントIDとシークレットを確認することもできます。)