2024/03/05(火)TypeScript + SWC + Jestで親classをモックする方法

更新日:
投稿日:

親クラスをモックして子クラスの単体テストをしたいときに

確認環境

Env Ver
@swc/cli 0.1.65
@swc/core 1.3.105
@swc/jest 0.2.31
@types/jest 29.5.11
jest 29.7.0
typescript 5.3.3

サンプルコード

コードのフルセットは以下
https://github.com/Lycolia/typescript-code-examples/tree/main/mocking-base-class-with-extension-class-swc-ts

ディレクトリ構成

src
 ├─BaseClass
 │  └─index.ts
 └─ChildrenClass
    ├─index.ts
    └─index.spec.ts

src/BaseClass/index.ts

親クラス。この例は抽象クラスだが別に具象クラスでも何でもいいと思う

export abstract class BaseClass {
  constructor(
    private baseValue: string,
    private ctx: { [key: string]: unknown }
  ) {}

  public hoge<ResultT>(payload: { [key: string]: unknown }) {
    // テスト走行時には全て無効な値を流し込むため
    // それらの影響で落ちないことの確認のために、オブジェクトの子を意図的に書いている
    console.log(this.baseValue, this.ctx.hoge, payload.piyo);
    // サンプルコードなので戻り値はスタブ
    return {} as ResultT;
  }
}

src/ChildrenClass/index.ts

子クラス

import { BaseClass } from '../BaseClass';

export class ChildrenClass extends BaseClass {
  constructor(baseValue: string, ctx: { [key: string]: unknown }) {
    super(baseValue, ctx);
  }

  public piyo<ResultT>(payload: { [key: string]: unknown }) {
    try {
      // このsuper.hoge()をモックして、
      // catchの中に流れるかどうかを確認するのが目的
      return super.hoge<ResultT>(payload);
    } catch (err) {
      // 実際はロガーが動くような部分だが、サンプルコードのためconsole.logで代用する
      console.log(err);

      throw err;
    }
  }
}

src/ChildrenClass/index.spec.ts

子クラスのテスト

import { ChildrenClass } from '.';
import { BaseClass } from '../BaseClass';

describe('fetch', () => {
  it('親のfetchが呼ばれ、親の戻り値が返ってくること', () => {
    // 子が正しくreturnしてくるかどうかを確認するための値
    const expected = { code: 200 };

    // Class.prototypeとやるとモック出来る
    const spiedSuperFetch = jest
      .spyOn(BaseClass.prototype, 'hoge')
      .mockReturnValue(expected);

    // 親クラスの処理はモックするので適当な値を入れておく
    // この内容が実行されていればテストが落ちるのでテストコードが間違っていることの検証に使える
    const inst = new ChildrenClass('aaaa', {} as { [key: string]: unknown });
    const actual = inst.piyo({ foo: 123 });

    // 親クラスのメソッドが正しい引数で呼ばれたことの確認
    expect(spiedSuperFetch).toHaveBeenCalledWith({ foo: 123 });
    // 子クラスのメソッドの戻り値が正しいことの確認
    expect(actual).toStrictEqual(expected);
  });

  it('親のfetchで例外が出たときに、ログ出力とリスローがされること', () => {
    const expected = Error('ERR');
    // 親クラスのメソッドが例外をスローするケースを作る
    jest.spyOn(BaseClass.prototype, 'hoge').mockImplementation(() => {
      throw expected;
    });

    // catch句の中でロガーが動いているかどうかの検査用
    const spiedConsoleLog = jest.spyOn(console, 'log');

    const inst = new ChildrenClass('aaaa', {} as { [key: string]: unknown });

    // 例外がリスローされていることを確認
    expect(() => {
      inst.piyo({ foo: 123 });
    }).toThrow(expected);
    // ロガーが動いていることを確認
    expect(spiedConsoleLog).toHaveBeenCalled();
  });
});

2024/03/04(月)最近買ったガジェットたち

更新日:
投稿日:

電子辞書 (EX-word)

ここ最近言葉の意味を調べようとするとコタツ記事であふれた検索結果や検索エンジンによる謎の解説ばかり出てきて本来の意味に辿り着けないケースが増えてきたので電子辞書を買った。

スマホアプリとかもあるにはあるのだがサブスク型で日々勝手が勝手に変わりそうでなんか嫌だったので買い切り型の物理デバイスにした。最近の電子辞書は中のコンテンツを充実させることで高価格を維持する路線をとっているらしく、広辞苑や国語辞典、英和辞典辺りがあれば十分だった私は型落ちの安いのを選んだ。

昔と違ってローマ字入力ができるのがありがたい。今でも廉価版だと五十音キーボードになっているらしく結構つらいものがある…。というので、ローマ字入力できるもので一番安いのを買ったが、ぼちぼちした。

箱はシンプルだ
シャンパンゴールドでいい感じの筐体
QWERTYキーボードが嬉しい

Surface Laptop 4

勉強会とかにもっと出たいけどノートPC買いたくないなぁ…という呪縛を破るために買った。Surface Laptop 4 5AI-00039だ。

スペックはCore i5 1135G7 4.20GHz/4C8T、MEM 16GB、ストレージ 512GB、重量 1,265g。因みにもう売った。

売った理由だが、まずキーボードがクソなのである。カーソルキーがノートPCあるあるな形状なのだが、特に↑↓の誤打鍵が酷く、文書作成やコーディング目的に使うにはクソ過ぎた。やってられなかった。

もう一つ理由があり、それはしょっちゅうフリーズすること、動きがもっさりすることだ。店頭で触ったのでこれは知っていたが、ちょっと正気ではなかった。我慢できなかった。私は短気なのだ。

スタイリッシュな箱
セットアップでArcマウスが使えないの微妙すぎる
このキー配列が嫌、特にカーソルキー

因みにWin+Eを数回連打するだけでありえない遅さだということが如実にわかるので、店頭の動作展示がこれほどよくわかる例もそうないだろう。それでも買ったのは以前Surface Pro 4を使っていたことと、単に見た目である。

因みにSurface Laptop 4はイマイチだが、Arcマウスはポータブルマウスとしてよく出来ている。平らにたためるのと、ホイールがなく、カバンの中で嵩張らず壊れづらいのは、とてもいい。

ノートPC (NEC Lavie)

Surfaceがクソ過ぎたので速攻買い替えたPC。Surfaceより遥かに軽いし、日本製だし、カーソルキーがまともだし、最高じゃないか。

マシンはNECのLavieで型式はPC-GN20D72DYEDYH2YAA。スペックはAMD Ryzen 5 7530U 4.5GHz/6C12T、MEM 16GB、ストレージ 256GB、重量 972gだ。

スタイリッシュさ皆無の武骨な箱。SDGsとはこういうことを言うのだと思う。私は好きだ。
恐らく追加パーツを収めるための空洞だろうか?汎用的な作りになっている。
天板とモニタを覆うようにカバーがかかっていて、日本人らしい気配りがとって見れる。素晴らしい

カーソルキーが小さくないので使いやすい

キーボードはカーソルキーがSurfaceと比べ大幅に改善され、極めてまともな形になっている。しかもHome, End, PageUp, PageDownがここにあるので使いやすい。Surfaceの奴は遠すぎる。

背面には大きめの通風孔がある
側面にも程よい通風孔がある

放熱にも気配りがされていて通風孔が多く、熱にも強そうだ。

使ってみての感想だが、まずやはりキーボードがいい。FnLockが凄い都合よく作られていて、Fキーはロックされるが、カーソルキーやDeleteとかの部分はロックされていないように感じた。これは地味に使いやすく、恐らく装飾キーだけロックし、それ以外はロックしない設計なのだろう。他はロックされても困るので非常に良い(いや別にChgKeyで配置換えすればいいだけなのでどうでもいいが

そしてパフォーマンスもいい。エクスプローラーの起動がもっさりすることもないし、今のところフリーズもしていない。欠点はNECの初期アプリを消すのに手間がかかったがそのくらいだ。

この端末は勉強会などでの開発に使う予定だが、最低限まともにGUIが動けば後はどうでもいいのでスペックを抑えている。何故なら実際の開発に関係する処理はUbuntuサーバーを利用するため、このマシン自体はシンクライアント機として機能すればいいからである。メモリ16GBは一般的には多くも見えるが、私は普通に作業してるだけで10GB程度はメモリを使うので、8GBでは足りないのである。

ヤマハルーター

いわゆる高いルータ。RTX830。

買った理由としてはVPNを引こうと思い、VPNルーターを買おうとして目についたので買った。要件を考えた結果、色々あり、結局のところVPNは使っていない。VPNは一度侵入を許すとやりたい放題されてしまうリスクがあるのと、セキュリティを考えたときにセットアップや維持がクソめんどくさそうだったのがある(端的に言うとルートCA証明書が必要で、これは作るのも面倒だし、これで署名した証明書を維持管理するのもしんどい)

結局VPNを使おうとしていた用途には公開鍵暗号方式のSSH接続で繋ぐことで事なきを得たが、この用途だけに限れば特にルーターを買い替える必要はなかった。

今のところの大きな利点としてはルーター再起動時にOCNバーチャルコネクトに安定接続できるのと、DNSサーバーが入っていることくらいだ。前使っていたルーターはOCNバーチャルコネクトの初回接続が極めて不安定で、メンテや停電などで一度でも再起動がかかると再接続に5~120分ほどかかるという地獄があり、これが嫌すぎて再起動のストレスがやばかったが、このルーターにしてこれは解消した。またDNSサーバーも思いのほか便利で、example.comを外出先ではグローバルIP、自宅ではローカルIPに自然とマップできるので、これは重宝している。

細かいことはコマンドで設定できるのでGUIを触らなくていいことくらいで、今のところそんなにすごい恩恵はないが、きっといつの日か何か恩恵が来ることもあるだろうというので、あまり後悔はしていない。出来ることは多いはずなので一種の投資だ。

箱は普通の段ボール。NECと同じスタイルだ。まぁ普通はこうだよね
いわゆる逸般人の部屋によくある見た目
清掃の人が足を引っかけても電源が抜けない仕様

ひとまず業務用ルーターということで見た目が強固だし、電源ケーブルが抜けないようにするアタッチメントもイケていい感じだ。

これまでに使っていたルーターはRTX830にぶら下げてWiFiのAPにするためのブリッジルーターとして使っている。因みにルーター交換に伴い通信環境が改善したとかはなかった。以前はBuffaloのWSR-1166DHP4を使っていたが、ここは非常にコストパフォーマンスのいいルーターを出しているので、安く早くある程度設定ができるルーターを求めている場合には重宝すると思う。夏場落ちたりすることもないし、5年単位で壊れないので作りもいい。低価格製品だと設定画面がお世辞にも使いやすいとは言えないが、用はこなせるので問題になることは一般用途では少ないだろう。

ブルーレイドライブ

今時光学ドライブ買う?と思われるだろうが、買ったのだ。しかもでかいやつ。CDドライブのころからそうなのだが、光学ドライブはデカいほうが性能がいい法則がある。コンパクトドライブと比較したときR/W速度が倍くらい違う。コンパクトドライブだとCDのReadはx24が上限だが、デカいやつはx48が一般的だ。異次元だ。その代わり値段は高い。需要が減ってきていると思われるので買うなら今だろうというので大型機を買うことにした。(こういう一般人に理解されがたいものは需要が薄そうなので追々消える懸念がある

デカい

バッファローのドライブを買うのは初めてな気がする。ドライブ系はIODATAが多かった

デカいが置く場所はあるので困らなかった。上にはRubix22と生田宮の仕事守が乗っている

コンパクトDVDドライブ

これは以前まで使っていたコンパクトDVDドライブだ。この期に売却となった。

自作デスクトップPCを持っているのに外付けドライブを買うのは何とも奇妙な話だが、最近のケースには5インチベイが付いてないのである。勿論付いているのもあるのだが、見栄えがいいケースには大抵付いていない。というわけで外付けになっている。

しかし何故DVDドライブではなくBDドライブを買ったかだが、実は前回もBDドライブを検討したのだが高かったし、インターネット全盛のこの時代にBDを使う機会はないと思っていたのだ。実際ディスクレスは増えている。しかし、実際は違った。レンタルではなく永続的に自分の手元に映像データを置いておくにはBDが必要だったのだ。dアニメやAmazon Prime Videoは一生見れる保証がない。ある日突然消える。それは困るというのでBDを買うことにしたわけだ。

SAOP二作、夏トン、ジョゼ虎、あしせかのBD

と言う訳でDVDも買っている。ひとまず印象深い映画ということで、SAOP二作、夏トン、ジョゼ虎、あしせかのBDを買った。映画館で見た作品を好きなタイミングで、また見れるというのはいいものだ。

久々にCDも買った

また丁度いいので久々にCDも買った。これまでもAmazonにMP3がないのはCDを買っていたのだが、ここ数年Amazon Digital Musicの改悪が酷く、まともにMP3を買えない問題があった。探すのも大変だし、買うのも大変だし、ダウンロードするのも大変だ。時期によっては酷いバグがあって力技を使わないとダウンロードできないことさえあった。最早Amazonは特定の曲を買わせる気など毛頭なく、Unlimitedに加入させてランダムな曲を再生させて集金することしか頭にないと思う。彼らにアーティストは理解できないのだ。どうせ禄でもない輩が開発しているに違いない。古きオタクには辛い時代になったが、そんならCDを買えばいい。幸いアニメイトが近所にあるので買いに行くのに困ることはない。ゲーマーズも虎の穴もつぶれたがアニメイトとメロンブックスはある。今こそ地の利を生かす時だ。通販で買うより行って買ったほうが運動になるしゴミも出ない!

x24がx48になっただけあり、CDは爆速でリッピングできたし、読み取り時の爆音もなくなって非常に快適だった。よい買い物をしたと思う。

2024/03/04(月)認証認可が必要なURLに賞味期限をつける奴の名前

更新日:
投稿日:

ここ数年見かける有効期限付きのURLの名前には署名付きURLとか、Private Cache Distributionパターンの様なものがあるらしい。

これはFantiaみたいな課金サービスを利用している人にはもはや当たり前だと思うが、ページを表示してから一定時間たつと画像が表示できなくなるが、一定時間内であればそのURLは誰でも見れるみたいなやつだ。要するにURLに短めの有効期限を付けて認証されたユーザーにしか見えなくする仕組みのことだ。

参考

2024/03/04(月)SSHDの設定方法

更新日:
投稿日:

確認環境

Ubuntu 22.04.3 LTS

設定ファイルのありか

/etc/ssh/sshd_config

公開鍵認証にする

SSHD側に公開鍵を置き、クライアント側からは秘密鍵でアクセスする

  1. sudo nano /etc/ssh/sshd_configで以下の設定に変更

    PubkeyAuthentication yes
    AuthorizedKeysFile      .ssh/authorized_keys
    PasswordAuthentication no
    PermitEmptyPasswords no
    
  2. 鍵置き場を作る

    mkdir ~/.ssh/
    
  3. 公開鍵を書き込む

    echo "公開鍵" > ~/.ssh/authorized_keys
    

備考

/etc/ssh/sshd_configPortもデフォルトの22から別の場所に変えておくとより良い。

2024/03/03(日)Windows 11でパスフレーズ付きの公開鍵認証SFTPをマウントする

更新日:
投稿日:

古のSFTPマウントツールが軒並み死んでいるためRcloneを使う。WindowsからLinux上に構築したストレージに繋ぐときに便利。

前提条件

  • 接続先のSSH環境がある
  • 接続先のSSH環境の公開鍵認証に利用する秘密鍵にパスフレーズが付いている

確認環境

Env Ver
OS Windows 11 Home 25H2(26200.8039)
Rclone 1.73.3

手順

1. 基本環境のインストール

  1. Rcloneをインストールする
    choco install rclone
    
  2. WinFspもインストールする。これがないとマウントできない

2. マウント設定の作成

  1. 次のコマンドで設定ウィザードを起動する
    rclone config
    
  2. 設定はこんな感じ

    # 新しい設定ファイルの作成
    No remotes found, make a new one?
    n) New remote
    s) Set configuration password
    q) Quit config
    n/s/q>n
    
    # 接続名を設定する
    Enter name for new remote.
    name> hoge
    
    # 接続先のストレージ種別をSSHで設定する
    Option Storage.
    Type of storage to configure.
    Choose a number from below, or type in your own value.
    1 / 1Fichier
    \ (fichier)
    2 / Akamai NetStorage
    \ (netstorage)
    3 / Alias for an existing remote
    \ (alias)
    4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, BizflyCloud, Ceph, ChinaMobile, Cloudflare, Cubbit, DigitalOcean, Dreamhost, Exaba, FileLu, FlashBlade, GCS, Hetzner, HuaweiOBS, IBMCOS, IDrive, Intercolo, IONOS, Leviia, Liara, Linode, LyveCloud, Magalu, Mega, Minio, Netease, Outscale, OVHcloud, Petabox, Qiniu, Rabata, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, Servercore, SpectraLogic, StackPath, Storj, Synology, TencentCOS, Wasabi, Zata, Other
    \ (s3)
    5 / Backblaze B2
    \ (b2)
    6 / Better checksums for other remotes
    \ (hasher)
    7 / Box
    \ (box)
    8 / Cache a remote
    \ (cache)
    9 / Citrix Sharefile
    \ (sharefile)
    10 / Cloudinary
    \ (cloudinary)
    11 / Combine several remotes into one
    \ (combine)
    12 / Compress a remote
    \ (compress)
    13 / DOI datasets
    \ (doi)
    14 / Drime
    \ (drime)
    15 / Dropbox
    \ (dropbox)
    16 / Encrypt/Decrypt a remote
    \ (crypt)
    17 / Enterprise File Fabric
    \ (filefabric)
    18 / FTP
    \ (ftp)
    19 / FileLu Cloud Storage
    \ (filelu)
    20 / Filen
    \ (filen)
    21 / Files.com
    \ (filescom)
    22 / Gofile
    \ (gofile)
    23 / Google Cloud Storage (this is not Google Drive)
    \ (google cloud storage)
    24 / Google Drive
    \ (drive)
    25 / Google Photos
    \ (google photos)
    26 / HTTP
    \ (http)
    27 / Hadoop distributed file system
    \ (hdfs)
    28 / HiDrive
    \ (hidrive)
    29 / ImageKit.io
    \ (imagekit)
    30 / In memory object storage system.
    \ (memory)
    31 / Internet Archive
    \ (internetarchive)
    32 / Internxt Drive
    \ (internxt)
    33 / Jottacloud
    \ (jottacloud)
    34 / Koofr, Digi Storage and other Koofr-compatible storage providers
    \ (koofr)
    35 / Linkbox
    \ (linkbox)
    36 / Local Disk
    \ (local)
    37 / Mail.ru Cloud
    \ (mailru)
    38 / Mega
    \ (mega)
    39 / Microsoft Azure Blob Storage
    \ (azureblob)
    40 / Microsoft Azure Files
    \ (azurefiles)
    41 / Microsoft OneDrive
    \ (onedrive)
    42 / OpenDrive
    \ (opendrive)
    43 / OpenStack Swift (Rackspace Cloud Files, Blomp Cloud Storage, Memset Memstore, OVH)
    \ (swift)
    44 / Oracle Cloud Infrastructure Object Storage
    \ (oracleobjectstorage)
    45 / Pcloud
    \ (pcloud)
    46 / PikPak
    \ (pikpak)
    47 / Pixeldrain Filesystem
    \ (pixeldrain)
    48 / Proton Drive
    \ (protondrive)
    49 / Put.io
    \ (putio)
    50 / QingCloud Object Storage
    \ (qingstor)
    51 / Quatrix by Maytech
    \ (quatrix)
    52 / Read archives
    \ (archive)
    53 / SMB / CIFS
    \ (smb)
    54 / SSH/SFTP
    \ (sftp)
    55 / Shade FS
    \ (shade)
    56 / Sia Decentralized Cloud
    \ (sia)
    57 / Storj Decentralized Cloud Storage
    \ (storj)
    58 / Sugarsync
    \ (sugarsync)
    59 / Transparently chunk/split large files
    \ (chunker)
    60 / Uloz.to
    \ (ulozto)
    61 / Union merges the contents of several upstream fs
    \ (union)
    62 / WebDAV
    \ (webdav)
    63 / Yandex Disk
    \ (yandex)
    64 / Zoho
    \ (zoho)
    65 / iCloud Drive
    \ (iclouddrive)
    66 / premiumize.me
    \ (premiumizeme)
    67 / seafile
    \ (seafile)
    Storage> 54
    
    # 接続先のホストを設定
    Option host.
    SSH host to connect to.
    E.g. "example.com".
    Enter a value.
    host> ssh.example.com
    
    # 接続先のユーザー名を設定
    Option user.
    SSH username.
    Enter a value of type string. Press Enter for the default (MYPC\myuser).
    user> hoge
    
    # 接続先のポートを指定、デフォルトならエンターで飛ばせると思う
    Option port.
    SSH port number.
    Enter a signed integer. Press Enter for the default (22).
    port> 12345
    
    # 鍵認証なのでエンターで飛ばす
    Option pass.
    SSH password, leave blank to use ssh-agent.
    Choose an alternative below. Press Enter for the default (n).
    y) Yes, type in my own password
    g) Generate random password
    n) No, leave this optional password blank (default)
    y/g/n>
    
    # エンターで飛ばす
    Option key_pem.
    Raw PEM-encoded private key.
    Note that this should be on a single line with line endings replaced with '\n', eg
        key_pem = -----BEGIN RSA PRIVATE KEY-----\nMaMbaIXtE\n0gAMbMbaSsd\nMbaass\n-----END RSA PRIVATE KEY-----
    This will generate the single line correctly:
        awk '{printf "%s\\n", $0}' < ~/.ssh/id_rsa
    If specified, it will override the key_file parameter.
    Enter a value. Press Enter to leave empty.
    key_pem>
    
    # 秘密鍵のパスを指定
    Option key_file.
    Path to PEM-encoded private key file.
    Leave blank or set key-use-agent to use ssh-agent.
    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.
    key_file> C:\path\to\hoge.sec
    
    # 秘密鍵のパスフレーズを入れる
    Option key_file_pass.
    The passphrase to decrypt the PEM-encoded private key file.
    Only PEM encrypted key files (old OpenSSH format) are supported. Encrypted keys
    in the new OpenSSH format can't be used.
    Choose an alternative below. Press Enter for the default (n).
    y) Yes, type in my own password
    g) Generate random password
    n) No, leave this optional password blank (default)
    y/g/n> y
    Enter the password:
    password:
    Confirm the password:
    password:
    
    # エンターで飛ばす
    Option pubkey.
    SSH public certificate for public certificate based authentication.
    Set this if you have a signed certificate you want to use for authentication.
    If specified will override pubkey_file.
    Enter a value. Press Enter to leave empty.
    pubkey>
    
    # エンターで飛ばす
    Option pubkey_file.
    Optional path to public key file.
    Set this if you have a signed certificate you want to use for authentication.
    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.
    pubkey_file>
    
    # エンターで飛ばす
    Option key_use_agent.
    When set forces the usage of the ssh-agent.
    When key-file is also set, the ".pub" file of the specified key-file is read and only the associated key is
    requested from the ssh-agent. This allows to avoid `Too many authentication failures for *username*` errors
    when the ssh-agent contains many keys.
    Enter a boolean value (true or false). Press Enter for the default (false).
    key_use_agent>
    
    # エンターで飛ばす
    Option use_insecure_cipher.
    Enable the use of insecure ciphers and key exchange methods.
    This enables the use of the following insecure ciphers and key exchange methods:
    - aes128-cbc
    - aes192-cbc
    - aes256-cbc
    - 3des-cbc
    - diffie-hellman-group-exchange-sha256
    - diffie-hellman-group-exchange-sha1
    Those algorithms are insecure and may allow plaintext data to be recovered by an attacker.
    This must be false if you use either ciphers or key_exchange advanced options.
    Choose a number from below, or type in your own boolean value (true or false).
    Press Enter for the default (false).
    1 / Use default Cipher list.
    \ (false)
    2 / Enables the use of the aes128-cbc cipher and diffie-hellman-group-exchange-sha256, diffie-hellman-group-exchange-sha1 key exchange.
    \ (true)
    use_insecure_cipher>
    
    # エンターで飛ばす
    Option disable_hashcheck.
    Disable the execution of SSH commands to determine if remote file hashing is available.
    Leave blank or set to false to enable hashing (recommended), set to true to disable hashing.
    Enter a boolean value (true or false). Press Enter for the default (false).
    disable_hashcheck>
    
    # エンターで飛ばす
    Option ssh.
    Path and arguments to external ssh binary.
    Normally rclone will use its internal ssh library to connect to the
    SFTP server. However it does not implement all possible ssh options so
    it may be desirable to use an external ssh binary.
    Rclone ignores all the internal config if you use this option and
    expects you to configure the ssh binary with the user/host/port and
    any other options you need.
    **Important** The ssh command must log in without asking for a
    password so needs to be configured with keys or certificates.
    Rclone will run the command supplied either with the additional
    arguments "-s sftp" to access the SFTP subsystem or with commands such
    as "md5sum /path/to/file" appended to read checksums.
    Any arguments with spaces in should be surrounded by "double quotes".
    An example setting might be:
        ssh -o ServerAliveInterval=20 user@example.com
    Note that when using an external ssh binary rclone makes a new ssh
    connection for every hash it calculates.
    Enter a value of type SpaceSepList. Press Enter to leave empty.
    ssh>
    
    # エンターで飛ばす
    Edit advanced config?
    y) Yes
    n) No (default)
    y/n>
    
    # 設定内容に問題ないことを確認してエンターで飛ばす
    # 設定を直す場合はeを選ぶと、ここまでの設定内容から修正したい箇所だけ編集できて便利
    Configuration complete.
    Options:
    - type: sftp
    - host: ssh.example.com
    - user: hoge
    - port: 12345
    - key_file: C:\path\to\hoge.sec
    - key_file_pass: *** ENCRYPTED ***
    Keep this "hoge" remote?
    y) Yes this is OK (default)
    e) Edit this remote
    d) Delete this remote
    y/e/d>
    
    # 設定の登録結果が出てくるので、特になければqで終わる
    Current remotes:
    
    Name                 Type
    ====                 ====
    hoge                 sftp
    
    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
    
  3. 設定が完了したら、以下のコマンドでマウントできる
    # 例:rclone mount hoge: Z: --network-mode
    # マウントパスを指定する場合はhoge:/path/toのようにすればよいと思うが試してない
    rclone mount <config name>:<mount path> <drive letter>: --network-mode
    

設定ファイルの在り処と中身

一回作った設定ファイルは持ち運べるし、手組もできるのでフォーマットが分かっていれば一々設定ウィザードを起動する必要はない。

  • 設定ファイルの在り処
    • %USERPROFILE%\AppData\Roaming\rclone\rclone.conf
  • 中身のフォーマットはiniファイルで接続先がWindowsのSSHだとshell_typecmd、UbuntuのSSHだとunixとなっていた

    [hoge]
    type = sftp
    host = ssh1.example.com
    user = foo
    port = 12121
    key_file = C:\path\to\hoge.sec
    key_file_pass = XXXXXXXXXXXXXX
    shell_type = cmd
    
    [piyo]
    type = sftp
    host = ssh2.example.com
    user = bar
    port = 12122
    key_file = C:\path\to\piyo.sec
    key_file_pass = YYYYYYYYYYYYYY
    shell_type = unix
    

トラブルシューティング

マウント時のターミナルウィンドウが邪魔

公式の解説によると、Windowsではバックグラウンドで動かすことができない

Use the --daemon flag to force background mode. On Windows you can run mount in foreground only, the flag is ignored.

どうしてもバックグラウンドで動かしたい場合はVDeskを使って適当な仮想デスクトップで起動するか、タスクトレイ系のユーティリティを使ってタスクトレイに突っ込んだりすると良さそうだ。

私は必要なときに都度起動し、仮想デスクトップを作って、そこに避難させとけば良いかな程度で今のところ考えている。この手のはネットワークが不安定な場所で動かすと色々面倒だし、使う頻度も低いので、今はそれで良いかなという感じ。

参考