Windows
SSH
OpenSSH
bat
コマンドプロンプト

Windows版OpenSSHの接続batファイルを便利にする

Windows版OpenSSHをSSHクライアントとして使ってみる
https://qiita.com/liberaldenial/items/0fe01950543e367fb46e
からの続きになります。SSH接続を行うbatファイルを更に便利にしてみようという試みです。

追加する機能

1.接続先情報と接続機能を別のbatファイルに分割する。
2.SCPが使えるようにする。
2-1.batファイルにドラッグアンドドロップしたらファイル送信
2-2.batファイルにフォルダをドラッグアンドドロップしたらフォルダの送受信どちらか確認し、フォルダ送受信でない場合はファイルを受信する。

フォルダ構成

・Windows側のフォルダ構成は以下の通りですがほぼ代わりありません。
├─OpenSSH-Win32
├─OpenSSH.bat(このにある.batを叩いて接続する)
└─sshkeys
  └─myself
    └─hogefuga(ここに鍵ファイルがある)

接続情報を持つbatの作成

このファイルにはSSH接続に必要な情報を書いておきます。このbatファイルに対してドラッグアンドドロップを行うとSSHSCP.batに引数が渡されSSHやSCPが接続情報を元に実行されます。このファイルは接続先の数だけ必要です。

@echo off
set HOSTNAME="hoge.jp"
set KEYFILE="..\sshkeys\myself\hoge\id_rsa"
set PORT="1001"
set USERNAME="hoge"
set PORTFORWARD="-L 10001:hoge:10001"

rem このファイルにドラッグアンドドロップされた引数を次のファイルにも渡す。
call SSHSCP.bat %1

接続機能を持つbatの作成

このファイルはOpenSSH.batフォルダ内に配置し、SSH接続を行うbatファイルが起動されたときに呼び出され、接続情報を元に接続を行います。このbatは1つあればいいです。

SSHSCP.bat
@echo off 
set OPENSSHPATH=..\OpenSSH-Win64\
set ARGS=%~1
set FILENAME=%~nx1
set FILEPATH=~/
cd /d %~dp0

if "%ARGS%"=="" (
    call :SSH_CONNECT
) else if exist "%ARGS%\" (
    call :SCP_SELECT
) else if not "%ARGS%"=="" (
    call :SCP_FILE_SEND
)

rem 何も引数がない場合はSSH接続
:SSH_CONNECT
%OPENSSHPATH%ssh.exe -p %PORT% -i %KEYFILE% %USERNAME%@%HOSTNAME% %PORTFORWARD%
echo 切断しました
pause
exit

rem ファイルの場合はSCP送信
:SCP_FILE_SEND
set /p FILEPATH="送信先ファイルパスを入力してください(デフォルト値:%FILEPATH%)  : "
echo %FILENAME%を%FILEPATH%に転送します
call :KAKUNIN
%OPENSSHPATH%scp.exe -P %PORT% -i %KEYFILE% %ARGS% %USERNAME%@%HOSTNAME%:%FILEPATH%
pause
exit

rem フォルダの場合は操作を選択する
:SCP_SELECT
set SCPFLG=
echo SCPを実行します操作を選択して下さい
set /p SCPFLG="(送信:s / 受信:r / 終了:q)?  : %SCPFLG%"
if "%SCPFLG%"=="s" (
  call :SCP_FOLDER_SEND
) else if "%SCPFLG%"=="r" ( 
  call :SCP_RECEIVE
) else  if "%SCPFLG%"=="q" (
  exit
) else (
  echo 他のキーが押されましたもう一度入力してください
  call :SCP_SELECT
)

rem SCPフォルダ送信
:SCP_FOLDER_SEND
set /p FILEPATH="送信先ファイルパスを入力してください(デフォルト値:%FILEPATH%)  :"
echo %ARGS%を%FILEPATH%に転送します
call :KAKUNIN
%OPENSSHPATH%scp.exe -P %PORT% -i %KEYFILE% -r %ARGS% %USERNAME%@%HOSTNAME%:%FILEPATH%
pause
exit

rem SCP受信
:SCP_RECEIVE
set /p FILEPATH="受信するファイルパスを入力してください(デフォルト値:%FILEPATH%)  : "
set /p RECEIVE_FILENAME="受信するファイル名を入力してください(フォルダの場合は未入力にする)  : "
echo %FILEPATH%%RECEIVE_FILENAME%を%ARGS%に転送します
call :KAKUNIN
if "%RECEIVE_FILENAME%" == "" (
  call :SCP_FOLDER_RECEIVE
) else (
  call :SCP_FILE_RECEIVE
)
pause
exit

rem SCPフォルダ受信
:SCP_FOLDER_RECEIVE
%OPENSSHPATH%scp.exe -P %PORT% -i %KEYFILE% -r %USERNAME%@%HOSTNAME%:%FILEPATH% %ARGS%
exit /b

rem SCPファイル受信
:SCP_FILE_RECEIVE
%OPENSSHPATH%scp.exe -P %PORT% -i %KEYFILE% %USERNAME%@%HOSTNAME%:%FILEPATH%%RECEIVE_FILENAME% %ARGS%\%RECEIVE_FILENAME%
exit /b

:KAKUNIN
SET /P YESNO="実行しますか?(y/n)  : "
if "%YESNO%" == "n" (
    exit
)
exit /b

ここまで作っておいて何だけど、これ使うことってあるのかなぁ。
gOpenSSHとかいう名前でGUIクライアントあったほうが良い気が・・・