WinSCPで更新されたファイルのみバックアップする

以前の記事「レンタルサーバーでバックアップしたファイルを自動DLする」では標準のftpコマンド、またはpsftp.exeを使い、mget *.zipコマンドなどで毎日のバックアップ作業を自動化するお話をしました。

さほど大きくないファイルならこれで良いですし、多少大きくても日別のディレクトリなどを作って毎日バックアップし、いつでも1ヶ月くらい前までは巻き戻せる状態にしておくというのはとても安心感があります。

しかし、「mozjpegとimagemagickでJPEG圧縮率を比較してみる」で話したように10年くらいブログを続けていると画像ファイルだけで2GB以上になってしまう場合もあり、それを毎日ローカルにダウンロードするとか、さすがにレンタルサーバーに負荷をかけすぎかなと思うわけです。

そうなると、更新/追加されたファイルだけをダウンロードしてくる、いわゆるミラーリング的な仕組みが欲しくなってきます。

ミラーリングバックアップならWinSCP

FTPソフトは色々あると思いますが、以下の条件を満たすとなるとWinSCPしか思い浮かびませんでした。

  • SFTPにもFTPSにも対応
  • リモートディレクトリとローカルディレクトリのミラーリング(同期)機能がある
  • コマンドラインで実行可能
  • テキストファイルに記述したコマンドをバッチ処理可能

WinSCPとは

Windows上で動作するオープンソースなFTPクライアントで通常のFTPはもちろん、セキュアなSFTP/FTPSにも対応しています。あと一応、名前のとおり、SCPプロトコルにももちろん対応。むかーしSCP使ったような記憶がありますが、最近使用例をほとんど聞きませんね。

あと、インストール不要でダウンロードして解凍すれば即座に使えるというのも、MS-DOS時代からパソコン使っているおじさん的にはポイント高いです。

WinSCPの準備

公式サイトの「Portable executables」からZIPファイルをダウンロードします。
https://winscp.net/eng/downloads.php

WinSCP-5.13.4-Portable.zip を解凍したら、中から以下のファイルが出てくるハズです。

  • WinSCP.com
  • WinSCP.exe

場所はどこでも良いのですが、ここでは c:\winscp に解凍したとして話を進めますね。

WinSCPをコマンドプロンプトで使う例

WinSCP.exeが本体なのですが、それをダブルクリックするとGUIが起動しちゃうので、コマンドプロンプトではWinSCP.comのほうを使います。

c:\winscp>winscp.com sftp://[ユーザー名]:[パスワード]@[ホスト名]:[ポート番号]

SFTPで接続する場合は sftp:// から、FTPSの場合は ftps:// から記述します。

ユーザー名/パスワードはレンタルサーバーから提供されたFTPアカウント情報で、ホスト名はFTPサーバーのホスト名、もしくはIPアドレスですね。

ポート番号はsftpなら22、ftpsなら21が一般的でしょうか。いずれにしてもレンタルサーバー側から接続情報が提供されているはず。

このブログを設置しているVALUE SERVERの例だと下記のようになります。

winscp.com sftp://user:pass@e1.valueserver.jp:22

ただ、このまま実行すると次のような質問をされるはず。

Searching for host...
Connecting to host...
Authenticating...
Continue connecting to an unknown server and add its host key to a cache?

The server's host key was not found in the cache. You have no guarantee that the server is the computer you think it is.

The server's RSA key details are:

    Algorithm:  ssh-rsa 2048
    SHA-256:    *******************************************=
    MD5:        **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**

If you trust this host, press Yes. To connect without adding host key to the cache, press No. To abandon the connection press Cancel.
In scripting, you should use a -hostkey switch to configure the expected host key.

「知らんサーバーに接続するけどホスト鍵をキャッシュするかい?」みたいなことを聞かれています。

ここでYを入力してキャッシュしても良いんですけど、場合によっては別PCで動かすかも知れないじゃないですか。テスト用のローカルPCとは別のPCを24時間稼働させ、バックアップの自動化とかしたくありませんか。そういった場合、バックアップサーバーでホスト鍵をキャッシュし忘れてタスクマネージャーが止まっていた… なんてことがあるんですよね。(経験談)

そんなわけで、「バッチ処理するなら -hostkeyスイッチでホスト鍵を指定したほうがいいよ」的なアドバイスが表示されていますし、ありがたいアドバイスに従い、ホスト鍵をメモっておきましょう。

SHA-256: ****みたいにマスクした部分ですが、実際は英数字の羅列があるハズです。

-hostkeyオプションの使用例はこんな感じ。

winscp.com sftp://user:pass@e1.valueserver.jp:22 -hostkey="ssh-rsa 2048 *******************************************="

ダブルクォートで囲むのと、ホスト鍵の先頭に ssh-rsa 2048 とかアルゴリズムの指定を忘れずに。

これでうまく接続できたら、bye と入力して切断しておきましょう。

続いてバッチ処理の話に移りますので。

WinSCPのコマンドを記述したテキストファイルを用意する

■テキストファイルの記述例

open sftp://[ユーザー名]:[パスワード]@e1.valueserver.jp:22 -hostkey="ssh-rsa 2048 *******************************************="
synchronize local c:/backup /virtual/[ユーザー名]/public_html/[ドメイン名]/wp-content/uploads -delete
bye

WinSCPにバッチ処理してほしいコマンドを記述するのですが、接続コマンドのopenも書くことができます。

  1. openコマンドでFTPサーバーへログイン
  2. synchronizeコマンドで更新されたファイルのみローカルへダウンロード
  3. FTPサーバーから切断

といった流れですね。

synchronizeは同期するコマンドなのですが、localと指定しているため、同期の方向はリモート→ローカルとなります。

ローカルディレクトリは c:\backup とし、リモートはWordPressを想定し、/wp-content/uploads にしてあるため、更新されたメディアファイルだけをローカルにコピーしてくるイメージですね。

また、-delete オプションを付けているので、リモートディレクトリから削除されたファイルはローカルディレクトリからも削除されます。

このテキストファイルを command.txt とか命名して保存し、/script=オプションで指定してあげれば一連の流れを実行してくれるはずです。

c:\winscp>winscp.com /script=command.txt

あとはこれをバッチファイルにでもして、タスクマネージャーに登録し、1日1回実行するようにしておけば更新されたファイルだけを同期する処理の完成ですね。

ほっといても自動的にバックアップしてくれる仕組みって素敵!

まとめ

  • 更新されたファイルだけローカルにバックアップするにはWinSCPが便利
  • winscp.comに/script=オプションを付けてコマンドを記述すればバッチ処理してくれる
  • winscpにはsynchronizeコマンドがあり、リモートとローカルのミラーリングができる

文章で解説するとちょっとややこしく感じますかね?

実際やってみると意外と簡単ですし、何より自動化はロマンなので、ぜひチャレンジして頂きたいところ。

WinSCPのコマンドには便利なものがたくさんあり、下記のコマンドリファレンスで詳しく解説されているので、こちらも読むとより一層理解が深まるかも知れません。

https://ja.osdn.net/projects/winscp/wiki/script_commands