$HOME/.ssh/confg で多段sshのconfigは作れるが、Windows10標準sshではやったことないぞ、という人向けのメモです
「どうせ同じだろ?」とか思ってると些細なところで意外とハマります
コマンドプロンプトで ssh -V や where ssh とかしてみるのが良いです
もし見つからない、エラーが出る場合は openssh client のインストールをしましょう
サービス ssh-agent を有効にし、起動する
秘密鍵のパーミッションを適切にする(≒ %userprofile%\.ssh\ に秘密鍵ファイルを直置きするか symlink を張る)
sshコマンドを使って多段する場合(大抵はそうなると思いますが)の
ProxyCommand ssh -W %h:%p gateway 2>/dev/null
ここの ssh コマンド部分はフルパスで指定しておくのが無難です
ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p gateway 2>/dev/null
既に WSL/msys2 等で config を作成している場合はこんな感じで変換してしまうのが楽です
# パス変換コマンド判別
if type wslpath >/dev/null 2>&1; then CMD=wslpath; elif type cygpath >/dev/null 2>&1; then CMD=cygpath; fi
# バックアップ取得後に ~/.ssh/config を変換
CONF=$("$CMD" "${APPDATA%\\AppData*}"/.ssh/config)
[ -f "$CONF" ] && cp "$CONF" /tmp/
sed 's/ProxyCommand ssh/ProxyCommand C:\\Windows\\System32\\OpenSSH\\ssh.exe/' <~/.ssh/config >"$CONF"
Match Host セクションで使うことが多いと思いますが、
ping コマンドは 回数(-c)、タイムアウト(-W)など、LinuxとWindowsで差分があるので必要に応じて変換します
さらに ping の出力を捨てておくと良いかもしれません
具体的には ping コマンドの末尾に >NUL を追加します
Linux
Match Host rasp* Exec "ping -c1 -W1 192.168.10.162"
HostName 192.168.10.162
Match Host rasp*
HostName 192.168.10.159
Windows
Match Host rasp* Exec "ping -n 1 -w 1 192.168.10.162 >NUL"
HostName 192.168.10.162
Match Host rasp*
HostName 192.168.10.159
変換例
sed 's/-c1 -W1/-n 1 -w 1/' | perl -pe 's/"\s*$/ >NUL$&/ if /ping/'
全部入りの手順
# パス変換コマンド判別
if type wslpath >/dev/null 2>&1; then CMD=wslpath; elif type cygpath >/dev/null 2>&1; then CMD=cygpath; fi
# バックアップ取得
CONF=$("$CMD" "${APPDATA%\\AppData*}"/.ssh/config)
[ -f "$CONF" ] && cp "$CONF" /tmp/
# ~/.ssh/config を変換(3行を一気にコピペ)
sed 's/ProxyCommand ssh/ProxyCommand C:\\Windows\\System32\\OpenSSH\\ssh.exe/' ~/.ssh/config |
sed 's/-c1 -W1/-n 1 -w 1/' |
perl -pe 's/"\s*$/ >NUL$&/ if /ping/' >"$CONF"
変というか、、、sshコマンドを入力後、プロンプトが返らずに固まったようになります
(4s後に Enter→固まる/15sec後に Ctrl+C で停止)
なんとかしてバックグラウンドで起動したい場合、
start コマンドを使って ssh のウィンドウを最小化してしまうと邪魔にならなくて良いかも
start /min ssh -vNL 8080:192.168.33.1:8080 remotepc.gateway
終了するときは ssh のウィンドウを開き、Ctrl+C します