【コマンド、ツールの概要】
・インストール済みのWinSCPを利用して公開鍵を使ったファイル転送を行うbat。
・WinSCPのインストールは簡単ですが、セッティングは以下につまずいたりしました。
1 公開鍵は接続先のログインユーザのフォルダに「.ssh」フォルダを作ってそこに入れる。
2 秘密鍵は接続時にローカルのものを指定する。
3 WinSCPで(接続後に行いたい処理の)スクリプトを書いたtxtを「/script」オプションで呼び出す。
4 秘密鍵のパスフレーズは実は直で指定可能(←頑張ったほめて。でもこの方法がセキュアかどうかは疑問)
5 文字化け(特にプロンプト表示)はある程度はあきらめる()
【環境(使っている環境)】
Windows Server 2008R2 to Windows Server 2016
WinSCP 5.13.4(ビルド8731)
【bat(WinSCPの呼び出し、「D:\WinSCP_SEND\TempTSV_Send\」にあるファイルを転送(同期)する)】
REM 日時設定(出力ファイル名に設定) SET Date_Tmp=%date:/=% SET Time_Tmp=%time:~0,2%%time:~3,2% SET Time_Tmp=%Time_Tmp: =0% REM フォルダ設定 SET BATFOL=D:\WinSCP_SEND\bat\ SET LOGFOL=D:\WinSCP_SEND\log\ SET SENDFOL=D:\WinSCP_SEND\TempTSV_Send\ REM WinSCP設定 SET WINSCPPRG="C:\Program Files (x86)\WinSCP\winscp.com" SET SCRIPTTXT=%BATFOL%syncFileswithWinSCP.txt SET XMLLOG=%LOGFOL%Up_log%Date_Tmp%_%Time_Tmp%.xml REM winSCP送信(D:\GSMS\TempTSV_Send\内に「.tsv」があれば同フォルダのファイルを全部転送したい) If exist %SENDFOL%*.tsv ( %WINSCPPRG% /console /script=%SCRIPTTXT% /xmllog=%XMLLOG% ) If %ERRORLEVEL% equ 0 ( REM エラーがなければoldフォルダへ退避処理。ここはよしなに。robocopy /?でコマンド詳細を確認してね robocopy %SENDFOL% %SENDFOL%old\ *.tsv /Z /MOV /V /is ) else ( REM <ここにエラー処理、WinSCPはエラったら0以外を返す> ) exit
【syncFileswithWinSCP.txt(WinSCPのスクリプト)】
option batch on option confirm off open sftp://リモートユーザID:リモートログインパスワード@XXX.XXX.XXX.XXX/ -rawsettings FSProtocol=2 -privatekey="秘密鍵パス\himityu.ppk" -passphrase=himityu.ppkのパスフレーズ cd ..\..\temp\Uploaded lcd D:\WinSCP_SEND\TempTSV_Send\ synchronize remote close exit
【使用方法】
・それぞれソースをコピペして拡張子を「.bat」「.txt」にして保存します。
・それぞれのファイルパス、フォルダパスに不備がないようにします。(フォルダがない場合の処理などは入れてません)
・batを実行します。
【説明】
いきなりこれを使う前に作成した秘密鍵と公開鍵が実際に使えるかを、WinSCPのGUIで設定して確認したほうが良いと思います。
WinSCPのコマンドについてはリファレンス参照で。
ざっくり、[openで接続を開く] → [cdでリモートディレクトリを指定] → [lcdでローカルディレクトリを指定] → [synchronize remoteでリモートをローカルに合わせる]
ていう処理の流れです。
【総評】
とにかく文字化けに苛まれるので起きている問題の把握が難しいです。
秘密鍵パスフレーズの自動入力はPageant(PuTTYの認証エージェント)が使えるなら素直にそれ使ってもいいかもしれません(常時起動が必須?)。
スクリプト直書きは企業での要件に耐えるかは保証できませんね。
VPN環境の構築が難しい場合はこういう仕組みも一考する必要がありますね。
【参考サイト】
WinSCP日本語Wiki - WinSCP Wiki - WinSCP - OSDN