WinSCPコマンドを使ったファイル自動ダウンロード、自動アップロードツールの作り方
掲載日:2020年12月9日
INFOMARTION > WinSCPコマンドを使ったファイル自動ダウンロード、自動アップロードツールの作り方
概要
WinSCPコマンドを使ったファイル自動ダウンロード、自動アップロードツールを作成します。 WinSCPで用意されているコマンドをコマンドプロンプトを使って実行します。 意外と知られていませんが、WinSCPにはコマンドが用意されています。 普段は「WinSCP.exe」を使用していると思いますが、「WinSCP.com」も用意されています。 ショートカットから基本的に普段開いていると思いますので、ショートカット先の「C:\Program Files (x86)\WinSCP」フォルダを見ることはほぼ無いと思いますが、ショートカット先を見ると「WinSCP.com」も格納されているはずです。 こちらを利用してツールを作成していきます。
1. WinSCPコマンドとは?
WinSCPコマンドとは普段GUIでしているWinSCPの操作を実行できるコマンドです。以下の操作画面で普段操作していると思いますが、この操作をコマンドにより実行します。
1-1. できること
以下のサイトに記載されているコマンドの実行が可能です。
https://ja.osdn.net/projects/winscp/wiki/script_commands
ファイルのダウンロードやアップロード、フォルダの作成、シェルコマンドの呼び出しなど色々なことが可能です。
よく使いそうなコマンドは以下です。
open・・・接続時に使用します。
get・・・ファイルをダウンロードする時に使用します。
put・・・ファイルをアップロードする時に使用します。
exit・・・切断時に使用します。
1-2. できないこと
基本的なファイルのダウンロードやアップロードは可能ですが、使ってみて、細かい部分の制御は難しそうです。
例えば、「ファイルの更新日を確認して指定の更新日のファイルを取ってくる」みたいなことは難しそうでした。
操作するファイルに複雑な条件を付けたい時は「call」コマンドでシェルを呼び出せばWindowsのコマンド、Linuxのコマンドなどを使って実現が可能だと思います。
2. 自動ダウンロードツール
実際にLinuxサーバに置いてあるログを自動ダウンロードするツールを作成していきたいと思います。
2-1. 作成
以下の条件でツールを作成します。
・実行環境がWindows10
・取得先サーバがLinux
・IPアドレスが192.168.50.10
まず、起動の起点となるbatファイルを作成します。
@setlocal enabledelayedexpansion
@set time2=%time: =0%
@set MKDIR_NAME=%date:~0,4%%date:~5,2%%date:~8,2%%time2:~0,2%%time2:~3,2%%time2:~6,2%
@set FOLDER=%~dp0%MKDIR_NAME%
@mkdir %FOLDER%
@"C:\Program Files (x86)\WinSCP\WinSCP.com" /console /script=%~dp0ftp.txt /parameter %FOLDER%
最後の行以外はWindowsコマンドの処理です。内容を説明すると
@setlocal enabledelayedexpansion
遅延環境変数のための設定です。簡単に説明すると、変数に値を設定しても反映されないことがあるのを防ぐ記述です。
@set time2=%time: =0%
@set MKDIR_NAME=%date:~0,4%%date:~5,2%%date:~8,2%%time2:~0,2%%time2:~3,2%%time2:~6,2%
@set FOLDER=%~dp0%MKDIR_NAME%
現在時刻からyyyymmddhmmssを取得して最終的にFOLDER変数に入れる処理です。
@mkdir %FOLDER%
バッチを実行したフォルダ直下に「yyyymmddhmmss」のフォルダを作成します。
@"C:\Program Files (x86)\WinSCP\WinSCP.com" /console /script=%~dp0ftp.txt /parameter %FOLDER%
「WinSCP.com(WinSCPコマンド)」を実行します。実行内容はバッチファイルが格納されている同一フォルダにある、「ftp.txt」に記載されているコマンドを実行します。引数として先程作成したフォルダパスを渡します。
これで、呼び出し元のファイルの作成は完了です。続いて、WinSCPコマンドを「ftp.txt」に記載していきます。
option batch on
option transfer binary
open test:testpassword@192.168.50.10
get /var/log/httpd/access_log %1%\
close
exit
内容を説明すると
option batch on
問い合わせが必要な処理については自動的に「いいえ」が選択されたものとして自動実行させます。これを入れるとファイル名が重複した時は自動で上書きをしてくれます。 (「yyyymmddhmmss」のフォルダを作ってそこに入れるのでファイル名が重複することはありませが。)
option transfer binary
バイナリーモードで転送する設定となります。
open test:testpassword@192.168.50.10
「ユーザ名:パス―ワード@IPアドレス」となります。IPアドレス「192.168.50.10」に対して、接続します。
get /var/log/httpd/access_log %1%\
「/var/log/httpd/access_log」を「yyyymmddhhmmss」フォルダに格納します。(「%1%」はfile_get.batで渡した引数)
正規表現も利用可能なので「/var/log/httpd/*」という書き方をすればログの全量取得可能です。
close
exit
切断処理となります。
以上でツールの作成は完了となります。
2-2. 実行準備
実行前に事前にフィンガープリントの確認を行います。
WinSCPで初回接続時に以下の様な画像が表示されると思います。
こちらは、一度も接続したことがないサーバの場合に、接続して問題ないかの確認となります。「はい」を押下するとWindowsのレジストリ領域というところに「はい」と押した記録が残ります。これにより2回目以降は確認されない仕組みとなっています。ツールを実行する際は事前にこちらの作業を行い、接続しても問題ないサーバであることの情報をレジストリ領域に保存する必要があるためコマンドプロンプトで以下のコマンドを実行します。(WinSCPのツールから1度接続するのでもOKです。)
"C:\Program Files (x86)\WinSCP\WinSCP.com"
open test:testpassword@192.168.50.10 ⇒応答を求めらるので「y」を入力
close
exit
exit
「test:testpassword@192.168.50.10」は「ユーザ名:パス―ワード@IPアドレス」に読み替えてください。
これで事前準備は完了となります。
2-3. 実行
いよいよ実行です。「file_get.bat」をダブルクリックします。
「yyyymmddhhmmss」のフォルダが作成されてフォルダの中にログが格納されていれば成功です。
3. 自動アップロードツール
次は、Linuxサーバにファイルを置くツールを作成していきたいと思います。基本的な作りはダウンロードツールと同じになります。
3-1. 作成
以下の条件でツールを作成します。
・実行環境がWindows10
・格納先サーバがLinux
・IPアドレスが192.168.50.10
まず、起動の起点となるbatファイルを作成します。
@setlocal enabledelayedexpansion
@set FOLDER_NAME="put_files\*"
@set FOLDER=%~dp0%FOLDER_NAME%
@set PUT_FOLDER="/tmp/"
@"C:\Program Files (x86)\WinSCP\WinSCP.com" /console /script=%~dp0put_ftp.txt /parameter %FOLDER% %PUT_FOLDER%
自動ダウンロードツールのところでも説明しているので、少し説明を省略しますが、バッチファイルを実行する同じフォルダ内にある「put_files」フォルダにあるファイルを「/tmp/」に格納する処理となります。実際に格納する処理は「put_ftp.txt」に記述していきます。
option batch on
option transfer binary
open test:testpassword@192.168.50.10
put %1% %2%
close
exit
こちらも、自動ダウンロードツールのところでも説明しているので、少し説明を省略しますが「put %1%\ %2%」のコマンドにより引数で渡された「格納元ファイル」「格納先フォルダ」によりファイルをアップロードします。
3-2. 実行準備
自動ダウンロードツールと同じく、実行前に事前にフィンガープリントの確認を行います。(自動ダウンロードツールで一度実行している場合は不要です。)
コマンドプロンプトで以下のコマンドを実行します。(WinSCPのツールから1度接続するのでもOKです。)
"C:\Program Files (x86)\WinSCP\WinSCP.com"
open test:testpassword@192.168.50.10 ⇒応答を求めらるので「y」を入力
close
exit
exit
「test:testpassword@192.168.50.10」は「ユーザ名:パス―ワード@IPアドレス」に読み替えてください。
これで事前準備は完了となります。
3-3. 実行
いよいよ実行です。「file_put.bat」をダブルクリックします。
「/tmp/」フォルダに「put_files」に格納したファイルが転送されていれば成功です。
4. その他よく使いそうなコマンド
基本的なダウンロードとアップロードは紹介しましたが、その他よく使いそうなコマンドも記載したいと思います。
4-1. 鍵認証
先ほどは以下の記述によりパスワード認証でログインしました。
open test:testpassword@192.168.50.10
「open ユーザ名:パスワード@IPアドレス」となります。鍵認証の場合は以下となります。
open test@192.168.50.10 -privatekey=id_rsa.ppk
「-privatekey=id_rsa.ppk」は鍵のパスとなります。相対パスで記載しているため、実行ファイル(batファイル)があるフォルダに鍵(id_rsa.ppk)もある前提となっています。例えばCドライブ直下に鍵がある場合は「-privatekey=C:\id_rsa.ppk」と書きます。
4-2. シェルの呼び出し
WinSCPコマンドによりシェルを呼び出す場合は以下の様に記述します。
option batch on
option transfer binary
open test:testpassword@192.168.50.10
call sh /tmp/test.sh
close
exit
「call sh /tmp/test.sh」により「test.sh」が実行されます。引数を渡すことも可能です。引数を渡すときは「call sh /tmp/test.sh hikisu1」の様にして書きます。
5. まとめ
WinSCPコマンドについて記載させていただきました。
普段、WinSCPのGUIを使って日次でログの取得やファイルアップロードをしている場合は、本記事に記載されていただいたツールを作成すれば自動化が可能です。軽微な作業かもしれませんが、毎日となると以外と時間をとられます。是非、効率化のためにツールを作成してみてください。
最後までご覧いただきありがとうございました。