PPK形式からOpen SSH形式に変換した秘密鍵を使ってGit bashからもSSHエージェント転送を可能にする

はじめに

会社から支給されているPCがWindowsなので、Windowsで使えるSSH Clientツールを使っている。
普段はRLoginを使っているのだが、Windows Terminalを使ってみたくなった。
RLoginからはPPKファイルを使ってSSHエージェント転送をしているので、Windows Terminalでも同様に秘密鍵のファイルを使ってSSHエージェント転送できるようにしたいが、初めてやるのでやり方が分からなかった。
これはやり方を調べて実践した時の記録。

環境

  • OS
    • windows10 バージョン 20H2 (OS ビルド 19042.2251)
  • Git
  • bash
    • 5.1.16(1)-release (x86_64-pc-msys)
Microsoft Windows [Version 10.0.19042.2251]
(c) Microsoft Corporation. All rights reserved.

C:\Users\masaharu.suizu>winver

image.png

$ git --version
git version 2.37.3.windows.1

$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-msys)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

準備 (PPK形式 -> Open SSH形式)

秘密鍵をPPK形式からOpen SSH形式に変換する。

  1. Open "PuTTYgen"
  2. "Conversions" → "Import key" → Select xxx.ppk file
  3. Enter passphrase
  4. "Conversions" → "Export OpenSSH (force new file format)" → Save it as "id_rsa"
  5. "id_rsa" fileの中身を確認
-----BEGIN OPENSSH PRIVATE KEY-----
...
...
...
...
-----END OPENSSH PRIVATE KEY-----

sshしてみる

これでsshする準備が整ったので、下記の手順でssh

  1. Open Windows Terminal > Git bash
  2. Execute below commands
$ ssh-agent bash
$ ps <- ssh-agentが立ち上がったかプロセスを確認
$ ssh-add -l
$ SSH_USER='user'
$ SSH_HOST='hoge'
$ SSH_PRIVATE_KEY='path/to'
$ ssh-add ${SSH_PRIVATE_KEY}
$ ssh -A ${SSH_USER}@${SSH_HOST}

.bashrcとかを活用しなければ上記の手順を毎回踏む必要がある。 毎回この手順を踏むのは面倒臭いので、少し工夫する。

少し工夫してssh

諸々の設定ファイルを編集

  1. Open Windows Terminal > Git bash
  2. Make config file for ssh

     $ vim ~/.ssh/config
    
     Host *
       ServerAliveInterval 60
    
     Host hoge.fuga
       HostName hoge.fuga
       User masaharu
       ForwardAgent yes
    
  3. Edit .bash_profile

     $ vim ~/.bash_profile
    
     mkdir -p /tmp/`date +%Y%m%d`
     SSH_AGENT_FILE="/tmp/`date +%Y%m%d`/.ssh-agent"
     test -f "${SSH_AGENT_FILE}" && source "${SSH_AGENT_FILE}"
     if ! ssh-add -l > /dev/null 2>&1; then
         # Pleaes set file path
         SSH_PRIVATE_KEY="xxx"
    
         ssh-agent > "${SSH_AGENT_FILE}"
         source "${SSH_AGENT_FILE}"
         ssh-add "${SSH_PRIVATE_KEY}"
     fi
    

※ 色々な書き方ができそう。

再度ssh

  1. Open Windows Terminal > Git bash
  2. (初回は入力が必要) Please input your private key pass passphrase

     Agent pid 51
     Enter passphrase for /c/Users/masaharu.suizu/.ssh/id_rsa:
     Identity added: /c/Users/masaharu.suizu/.ssh/id_rsa (/c/Users/masaharu.suizu/.ssh/id_rsa)
    
  3. Execute ssh command

     $ ssh hoge.fuga
    
SSH_AGENT_FILE="/tmp/`date +%Y%m%d`/.ssh-agent"

のファイルだけを消してしまうと無駄なプロセスが残ってしまうので注意。

さらに工夫

sshコマンドに対して補完機能を準備してあげると更に使い勝手が良くなりそう。

declare -a SERVER_LIST=($(grep 'HostName' ~/.ssh/config | awk {'print $2'}))

_ssh_completion(){
    local args=$(echo ${SSH_SERVER_LIST[@]})
    COMPREPLY=( `compgen -W "${args}" -- ${COMP_WORDS[COMP_CWORD]}` );
}
complete -F _ssh_completion ssh