sshの鍵登録 Windows
記録(要点)
- 発生日: (記録日時を入れてください)
- 問題: PowerShellでssh鍵をssh-agentに登録しようとしたが失敗した。
- 原因: 環境変数展開の書き方で “$env:USERPROFILE .ssh” のようにユーザープロファイルと .ssh の間にバックスラッシュ(\)が抜けており、PowerShell が “C:\Users\seiic.ssh” のような存在しないパスを参照してしまったため。結果として ssh-add に正しいパスが渡らず鍵が登録できなかった。
- 追加の注意点: コマンドと引数の間に全角スペースが入ると正しく解釈されないことがあるので、半角スペースを使うこと。
発生時の(誤った)コマンド例とエラーメッセージの原因
- 誤り例(パス区切り文字がない): ssh-add “$env:USERPROFILE.ssh\id_ed25519” → PowerShell は “$env:USERPROFILE.ssh” を環境変数参照と解釈し、存在しない “C:\Users\seiic.ssh\id_ed25519” を探すためエラーになる。
- 誤り例(全角スペースが含まれる): C:\Windows\Sysnative\OpenSSH\ssh-add.exe “$env:USERPROFILE.ssh\id_ed25519” → コマンドと引数の間に全角スペース(U+3000)が入ると PowerShell が正しくトークン分割できず「コマンドが見つからない」などの問題を引き起こす。
正しい対処・登録コマンド(PowerShell)
- まず .ssh フォルダと鍵ファイルの存在確認: dir “$env:USERPROFILE.ssh” -Force Test-Path “$env:USERPROFILE.ssh\id_ed25519”
- ssh-add(フルパスで実行する例、半角スペースを使用): & ‘C:\Windows\Sysnative\OpenSSH\ssh-add.exe’ “$env:USERPROFILE.ssh\id_ed25519” または(ssh-add が PATH にある場合) ssh-add “$env:USERPROFILE.ssh\id_ed25519”
- より確実な変数展開の書き方: & ‘C:\Windows\System32\OpenSSH\ssh-add.exe’ “${env:USERPROFILE}.ssh\id_ed25519”
- 登録確認と接続テスト: ssh-add -l ssh -T git@github.com
再発防止のためのメモ
- パス結合には Join-Path を使うと安全: Join-Path $env:USERPROFILE ‘.ssh\id_ed25519’
- 変数展開で不安なときは “${env:USERPROFILE}.ssh” のように波括弧で囲む。
- コマンドと引数は必ず半角スペースで区切る(全角スペースが紛れ込まないよう注意)。
- ssh-agent を自動化したい場合はサービス化(Set-Service …)やログオン時に ssh-add を実行するタスクを設定する。
記録例(そのまま保存できる短い文章)
- 「PowerShellで ssh-add を実行した際、$env:USERPROFILE と .ssh の間にバックスラッシュが抜けていたため ‘C:\Users\seiic.ssh’ のような存在しないパスが生成され、鍵の登録に失敗した。正しくは ‘$env:USERPROFILE.ssh\id_ed25519’ を指定する必要がある。また、コマンドと引数の間に全角スペースが入ると正常に動作しないので、半角スペースを使うこと。対処として & ‘C:\Windows\Sysnative\OpenSSH\ssh-add.exe’ "$env:USERPROFILE.ssh\id_ed25519" を実行し、ssh-add -l で登録を確認した。」