NDW

アプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング 実装技術

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

投稿日:2021年5月4日 更新日:

技術検証

概要

使用方法

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

  1. rcloneのインストール
    RHEL8.3の場合は次のようにyumやdnfからインストールできます。公式サイトからバイナリをダウンロードすることもできます。
    # yum install rclone
  2. rcloneの設定初期化コマンドの実行
    rcloneを使用するユーザで次のコマンドを実行します。
    $ rclone config
  3. 接続先としてGoogle Driveの登録
    前述の設定初期化コマンドを実行すると条件の入力を求められるので、次のように順次入力していきます。(詳細は「接続先として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:/testdir1
    subdir/
    subdirempty/
    subfile.docx
    subfile2.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.dat
    2021/05/03 21:20:38 NOTICE: testfile.dat: Skipped delete as --dry-run is set (size 1M)
    
    $ rclone --dry-run delete gd:/testdir1/notfound
    2021/05/03 21:23:59 ERROR : Attempt 1/3 failed with 1 errors and: directory not found
    2021/05/03 21:23:59 ERROR : Attempt 2/3 failed with 1 errors and: directory not found
    2021/05/03 21:24:00 ERROR : Attempt 3/3 failed with 1 errors and: directory not found
    2021/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 config
    No remotes found - make a new one
    n) New remote
    s) Set configuration password
    q) Quit config
    n/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 Id
    Setting 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> xxxxxxxxxx
    OAuth Client Secret
    Leave 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 folder
    Leave blank normally.

    Fill in to access "Computers" folders (see docs), or for rclone to use
    a 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 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> (未指定)
  8. 詳細な設定を行うかを指定する。
    Google Driveに接続する場合、詳細な設定は必要ありません。
    Edit advanced config? (y/n)
    y) Yes
    n) No (default)
    y/n> (未指定)
  9. アクセストークンの取得方法を選択します。
    • "auto config"は自動で検証コードを登録する機能です。
    • "y"を選択した場合、Linux上でブラウザが起動し、Googleの認証や同意画面が表示されます。認証や同意に成功した場合、発行された検証コードが自動的にrcloneの設定に保存されます。
    • "n"を選択した場合、URIが表示されるので、そのURIを自身でブラウザに張り付けて認証や同意する必要があります。成功した場合は検証コードが表示されるので、その内容をコピペする必要があります。
    • ここではCLIの使用を前提としているため、"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> n

    Please go to the following link: https://accounts.google.com/o/oauth2/auth?...

    Log in and authorize rclone for access
    Enter verification code> xxxxxxxxxxxxxxxxxxxxxxx
  10. 共有フォルダを構成するかを指定します。
    Configure this as a Shared Drive (Team Drive)?
    y) Yes
    n) No (default)
    y/n> n
  11. 設定内容を保存します。
    --------------------
    [gd]
    type = drive
    scope = drive
    token = {"access_token":"...",...}
    --------------------
    y) Yes this is OK (default)
    e) Edit this remote
    d) Delete this remote
    y/e/d> y
  12. 設定を終了します。
    Current remotes:

    Name Type
    ==== ====
    gd 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

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とシークレットを確認することもできます。)


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-1. システムエンジニアリング, 実装技術

関連記事

wildflyアップロードサイズ上限

多くのWebサーバやAPサーバでは、サーバリソースの過剰な消費やDoS攻撃に対する対処として、アップロードの最大サイズが決められている。(厳密には、ブラウザから入力値やファイル等のデータを送信するため …

Wildflyでリクエストをダンプする

Webアプリのデバッグや障害対応等で、Webアプリに対するリクエストやレスポンスのHTTPヘッダや内容を確認したい場合がある。 次のような場面ではクライアント側での確認ができないため、今回のようにAP …

開発・検証用のダミーメールサーバの構築(fakeSMTP)

アプリ開発や検証等でメールサーバを利用したい場合がある。 プロジェクトで共有の検証用メールサーバを構築できると効率が良いか、その準備が間に合わなかったり、使用者が限定的な場合は、使用者の開発環境上に構 …

Wildfly11のインストール

このサイトでWebアプリを公開したい。 仕事ではJBoss Enterprise Application Server(JBoss EAP)を使う機会が多いのでそれを使いたいがライセンス料がかかる。無 …

DB操作フレームワーク はJPA or mybatis?

開発に向けた準備で、開発標準を準備するフレームワーク(FW)チーム、それらを使って実装を行う業務チームが集まって、「DB操作を行うためのFWは何を使うか?」という協議になった。 FWチームは、FW・J …