内容:
設定ファイル(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 によると、次のいずれか:
- パスフレーズなし秘密鍵を作成し、それを、デフォルトの鍵ファイル名(おそらく ~/.ssh/id_rsa)にする(デフォルトは諸悪の根源だから使う気はない)
- パスフレーズなし秘密鍵を作成し、それを、.ssh/config に設定
- パスフレーズなし秘密鍵を作成し、それを、JSON設定ファイルの commandline 項目に指定のsshコマンドラインの-iオプションに指定
基本
まず、基本概念や問題点を列挙する:
- 鍵ペア: SSHクライアント用の秘密鍵、SSH サーバー用の公開鍵のペア
- 秘密鍵と公開鍵を作成する際にパスフレーズとコメントを埋め込むことができる。が使う必要はない。特に今回は入れない!
- Windowsデフォルト設定において: [Administrators] グループのみ、公開鍵 (authorized_keys) の場所が OpenSSH デフォルトの
.ssh\authorized_keys
ではなく、設定ファイルC:\ProgramData\ssh\sshd_config
の設定により決まる。 - さらに、設定ファイルにおけるデフォルトの AuthorizedKeysFile は
$env:PROGRAMDATA\ssh\administrators_authorized_keys
- 全ユーザーで設定を合わせたい場合は、事前に、管理者権限で設定ファイルの最終2行(AuthorizedKeysFile)をコメントアウトしてからサービスを再起動しておく必要がある。
- SSH鍵ペアは、ssh-keygen コマンドで作れる。
- ssh-keygen -q でメッセージを表示しない。-C "" でコメントなし、-N "" でパスフレーズなし。
- sshコマンドの -t オプションには暗号化方式を指定、RSA、DSA、ECDSA、Ed25519、SSH-1(RSA) などがある。https://gigazine.net/news/20200828-ssh-encryption-algorithm/ によると、EdDSA(Ed25519)推奨。DSA やECDSA は使わないらしい。RSA, SSH-1 は論外。
- ssh-keygen -f ファイル名 で、生成する秘密鍵ファイルを明示的に指定。
- ssh-keygenコマンド実行後、ホームフォルダー配下に
.ssh
フォルダーが作成され、その配下に鍵ペア(のファイル)が生成される。 - 生成されるファイル名は id_rsa と id_rsa.pub 。id_rsa が秘密鍵、id_rsa.pub が公開鍵。
- cmd.exe からなら、コマンドライン:
ssh-keygen.exe -q -t ed25519 -C "" -N "" -f id_rsa
- Powershell では、
ssh-keygen.exe -q -t ed25519 -C '""' -N '""' -f id_rsa
(https://qiita.com/overflowfl/items/14a2486df85fd7efac85より) - サーバー側での公開鍵ファイル名のデフォルトは authorized_keys、
mv id_rsa.pub authorized_keys
して使う。 - Windowsがサーバーのとき、
icacls authorized_keys /remove Everyone
でアクセス権限変更。 - SSHクライアントは、サーバー上の authorized_keys に対応する秘密キーを自マシンに保持している必要がある。サーバー側で鍵ペアを生成したなら、(秘密鍵)サーバ → クライアント の転送; クライアント側で鍵ペアを生成したなら、(公開鍵)クライアント → サーバ の転送が必要。
- サーバ → クライアント の転送なら sftp などで当該の id_rsa をローカルに持ってくる。
今回は、クライアントマシン側でキーフレーズなしの鍵ペアを生成して、公開鍵をサーバ側に送る。
- Powershell で、
ssh-keygen.exe -q -t ed25519 -C '""' -N '""' -f id_rsa
- サーバ側の公開鍵の送り先は、
~/.ssh/authorized_keys
。ただし、もともとあるファイルを潰さないように、cat id_rsapub >> ~/.ssh/authorized_keys
でアペンドする。 - ファイル転送に使う方法は何でもいいが、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 の実際の場所が
$env:USERPROFILE\.ssh\
$env:HOME\.ssh\config
異なる場所
の2つがある。どっちがどっちかワケワカラナクなっている。他のコマンドでも同じ混乱が起きている。