裏窓/Windows10標準のssh.exeで多段sshするまでの道のり

はじめに

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

sshが使えるか確認

コマンドプロンプトで ssh -V や where ssh とかしてみるのが良いです

 75%

もし見つからない、エラーが出る場合は openssh client のインストールをしましょう

ssh-agent を使えるようにする

サービス ssh-agent を有効にし、起動する

秘密鍵のパーミッションを適切にする(≒ %userprofile%\.ssh\ に秘密鍵ファイルを直置きするか symlink を張る)

必要に応じて ~/.ssh/config の ProxyCommand を見直す

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"

pingコマンド差分

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"

備考

-f オプションが変

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

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

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

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


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-02-19 (金) 11:18:55