wt(Windows Terminal) + SSH

内容:

設定ファイル(JSON)

wt の設定ファイルの場所がややこしい!

  • $env:LocalAppData\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

順番に辿るなら:

> cd $env:local[TAB]
(補完: cd $env:LOCALAPPDATA)
> cd Packages
> cd .\Microsoft.WindowsT[TAB]
(補完: cd .\Microsoft.WindowsTerminal_8wekyb3d8bbwe\)
> cd LocalS
(補完: cd .\LocalState\)
> code .

ConoHa の設定エントリーなら次のよう。

{
    "backgroundImage": null,
    "colorScheme": "Solarized Light",
    "commandline": "ssh XXX@XXX(ip addr)XXX",
    "guid": "{d2c4024c-bdae-5a30-81ff-877fed55010a}",
    "icon": "C:\\Users\\m-hiyama\\Pictures\\2021-08\\ConoHa-Co.jpg",
    "name": "ConoHa"
},
目的

ターミナルタブを開いときに実行されるコマンドは ssh コマンド(C:\WINDOWS\System32\OpenSSH\ssh.exe)。

現状パスワードを聞かれるので、パスワードをスキップする設定にする。https://zaki-hmkc.hatenablog.com/entry/2020/09/03/083634 によると、次のいずれか:

  1. パスフレーズなし秘密鍵を作成し、それを、デフォルトの鍵ファイル名(おそらく ~/.ssh/id_rsa)にする(デフォルトは諸悪の根源だから使う気はない)
  2. パスフレーズなし秘密鍵を作成し、それを、.ssh/config に設定
  3. パスフレーズなし秘密鍵を作成し、それを、JSON設定ファイルの commandline 項目に指定のsshコマンドラインの-iオプションに指定
基本

まず、基本概念や問題点を列挙する:

  1. 鍵ペア: SSHクライアント用の秘密鍵、SSH サーバー用の公開鍵のペア
  2. 秘密鍵と公開鍵を作成する際にパスフレーズとコメントを埋め込むことができる。が使う必要はない。特に今回は入れない!
  3. Windowsデフォルト設定において: [Administrators] グループのみ、公開鍵 (authorized_keys) の場所が OpenSSH デフォルトの .ssh\authorized_keys ではなく、設定ファイル C:\ProgramData\ssh\sshd_config の設定により決まる。
  4. さらに、設定ファイルにおけるデフォルトの AuthorizedKeysFile は $env:PROGRAMDATA\ssh\administrators_authorized_keys
  5. 全ユーザーで設定を合わせたい場合は、事前に、管理者権限で設定ファイルの最終2行(AuthorizedKeysFile)をコメントアウトしてからサービスを再起動しておく必要がある。
  6. SSH鍵ペアは、ssh-keygen コマンドで作れる。
  7. ssh-keygen -q でメッセージを表示しない。-C "" でコメントなし、-N "" でパスフレーズなし。
  8. sshコマンドの -t オプションには暗号化方式を指定、RSA、DSA、ECDSA、Ed25519、SSH-1(RSA) などがある。https://gigazine.net/news/20200828-ssh-encryption-algorithm/ によると、EdDSA(Ed25519)推奨。DSA やECDSA は使わないらしい。RSA, SSH-1 は論外。
  9. ssh-keygen -f ファイル名 で、生成する秘密鍵ファイルを明示的に指定。
  10. ssh-keygenコマンド実行後、ホームフォルダー配下に .ssh フォルダーが作成され、その配下に鍵ペア(のファイル)が生成される。
  11. 生成されるファイル名は id_rsa と id_rsa.pub 。id_rsa が秘密鍵、id_rsa.pub が公開鍵。
  12. cmd.exe からなら、コマンドライン: ssh-keygen.exe -q -t ed25519 -C "" -N "" -f id_rsa
  13. Powershell ではssh-keygen.exe -q -t ed25519 -C '""' -N '""' -f id_rsahttps://qiita.com/overflowfl/items/14a2486df85fd7efac85より)
  14. サーバー側での公開鍵ファイル名のデフォルトは authorized_keys、mv id_rsa.pub authorized_keys して使う。
  15. Windowsがサーバーのとき、 icacls authorized_keys /remove Everyone でアクセス権限変更。
  16. SSHクライアントは、サーバー上の authorized_keys に対応する秘密キーを自マシンに保持している必要がある。サーバー側で鍵ペアを生成したなら、(秘密鍵)サーバ → クライアント の転送; クライアント側で鍵ペアを生成したなら、(公開鍵)クライアント → サーバ の転送が必要。
  17. サーバ → クライアント の転送なら sftp などで当該の id_rsa をローカルに持ってくる。

今回は、クライアントマシン側でキーフレーズなしの鍵ペアを生成して、公開鍵をサーバ側に送る。

  1. Powershell で、ssh-keygen.exe -q -t ed25519 -C '""' -N '""' -f id_rsa
  2. サーバ側の公開鍵の送り先は、~/.ssh/authorized_keys 。ただし、もともとあるファイルを潰さないように、cat id_rsapub >> ~/.ssh/authorized_keys でアペンドする。
  3. ファイル転送に使う方法は何でもいいが、https://zaki-hmkc.hatenablog.com/entry/2020/09/03/083634 にあったのは以下の対話。
PS> cat .\.ssh\id_rsa_nopass.pub | ssh user@host sh -c "cat - >> ~/.ssh/authorized_keys" 
(サーバからのパスワード要求) password: (これは仕方ない)
秘密鍵ファイル名のコマンドライン指定

ローカルの秘密鍵ファイル名を指定する方法なら、wtの設定JSONファイル内で:

{
    "backgroundImage": null,
    "colorScheme": "Solarized Light",
    "commandline": "ssh XXX@XXX(ip addr)XXX -i 秘密鍵ファイルのフルパス(バックスラエスケープに注意)",
    "guid": "{d2c4024c-bdae-5a30-81ff-877fed55010a}",
    "icon": "C:\\Users\\m-hiyama\\Pictures\\2021-08\\ConoHa-Co.jpg",
    "name": "ConoHa"
},

この方法なら、他の設定は必要ない。

設定ファイルに秘密鍵ファイル名を指定
  • $env:USERPROFILE\.ssh\config に秘密鍵ファイルの名前と置き場所を指定
Host <Host-Nickname>
  HostName <IP-Addr>
  User <User-Name>
  IdentityFile <PathToIdRsaFile>
困っていること

sshコマンドが C:\WINDOWS\System32\OpenSSH\ssh.exe 以外、あるいは別なシェルから使う場合で状況が違って、.ssh の実際の場所が

  1. $env:USERPROFILE\.ssh\
  2. $env:HOME\.ssh\config 異なる場所

の2つがある。どっちがどっちかワケワカラナクなっている。他のコマンドでも同じ混乱が起きている。