#author("2021-12-15T20:54:13+09:00","default:nobuoki","nobuoki")
#author("2021-12-15T20:54:38+09:00","default:nobuoki","nobuoki")
* はじめに [#h47c1e9e]

$HOME/.ssh/confg で多段sshのconfigは作れるが、Windows10標準sshではやったことないぞ、という人向けのメモです
「どうせ同じだろ?」とか思ってると些細なところで意外とハマります

- 2021/02/20 ~/.ssh/config 変換コマンドの修正
- 2021/02/19 ~/.ssh/config 変換コマンドを見直し(WSL対応)
- 2021/12/15 2>dev/null 追記、全部入り変換手順を追記
- 2021/12/15 NUL、全部入り変換手順を追記

** sshが使えるか確認 [#k9d66e78]
コマンドプロンプトで ssh -V や where ssh とかしてみるのが良いです
#ref(./0720-02.png, 75%)

もし見つからない、エラーが出る場合は openssh client のインストールをしましょう
- [[Windows10 に OpenSSH インストール - Qiita>https://qiita.com/sigenyan/items/1de0b74541f5cef7614f]]

* ssh-agent を使えるようにする [#we4ba40a]
サービス ssh-agent を有効にし、起動する
- [[Windows 10のssh-agentをコマンド プロンプト、WSL、Git Bashで使ってみた - Qiita>https://qiita.com/q1701/items/3cdc2d7ef7a3539f351d]]

秘密鍵のパーミッションを適切にする(≒ %userprofile%\.ssh\ に秘密鍵ファイルを直置きするか symlink を張る)
- [[Windows版VSCodeで秘密鍵の位置に関係なくSSHログインするには - Qiita>https://qiita.com/mindwood/items/ddae674a0694402f22a6]]

* 必要に応じて ~/.ssh/config の ProxyCommand を見直す [#i886a3e0]
sshコマンドを使って多段する場合(大抵はそうなると思いますが)の

  ProxyCommand ssh -W %h:%p gateway 2>/dev/null

ここの ssh コマンド部分はフルパスで指定しておくのが無難です
- [[Windwos10でssh ProxyCommandの多段SSHの設定 - suzu6>https://www.suzu6.net/posts/205-ssh-config-proxycommand-windows10/]]

  ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p gateway 2>/dev/null

既に WSL/msys2 等で config を作成している場合はこんな感じで変換してしまうのが楽です

#prism(bash){{{
# パス変換コマンド判別
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"
}}}

** pingコマンド差分 [#mc2c4ffa]

Match Host セクションで使うことが多いと思いますが、
ping コマンドは 回数(-c)、タイムアウト(-W)など、LinuxとWindowsで差分があるので必要に応じて変換します

さらに ping の出力を捨てておくと良いかもしれません
具体的には ping コマンドの末尾に >NUL を追加します

Linux
#prism(bash){{{
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
#prism(bash){{{
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
}}}

変換例
#prism(bash){{{
sed 's/-c1 -W1/-n 1 -w 1/' | perl -pe 's/"\s*$/ >NUL$&/ if /ping/'
}}}

全部入りの手順
#prism(bash){{{
# パス変換コマンド判別
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"
}}}


* 備考 [#odd5037a]


** -f オプションが変 [#r6a5f462]
変というか、、、sshコマンドを入力後、プロンプトが返らずに固まったようになります
(4s後に Enter→固まる/15sec後に Ctrl+C で停止)

#youtube(VkHXJQU_oFE)

なんとかしてバックグラウンドで起動したい場合、
start コマンドを使って ssh のウィンドウを最小化してしまうと邪魔にならなくて良いかも


  start /min ssh -vNL 8080:192.168.33.1:8080 remotepc.gateway

終了するときは ssh のウィンドウを開き、Ctrl+C します

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS