レンタルサーバーでバックアップしたファイルを自動DLする

前回の記事「PHPでファイルとDB(PostgreSQL)をバックアップ」でレンタルサーバー上のファイルや、PostgreSQLデータベースをバックアップしてZIPファイルにするところまで解説しました。

今回はそのファイルをローカルへダウンロードする処理も自動化しよう、という話です。

FTP接続でダウンロードするバッチ処理

てっとり早いのはFTP接続ですね。

Windows 10 では標準でFTPコマンドが使えますし、予め実行するコマンドを記述したテキストファイルを用意し、-sオプションで指定すればバッチ処理も可能です。

■command.txtの例

open e1.valueserver.jp
ユーザ名
パスワード
cd /virtual/ユーザー名/backup
get backup.zip

e1.valueserver.jpのところは接続先のホストを。ユーザー名とパスワードにはFTPのログイン情報を記述します。

■コマンドライン

C:\>ftp -s:command.txt

このように、ftpコマンドに -s オプションでcommand.txtを指定してあげるだけで忠実に実行してくれます。

zipファイル名に任意の日付(YYYYMMDD_backup.zipとか)を付けていたとしてもget backup.zipの部分をmget *.zipとワイルドカード指定することもできるので、タスクスケジューラーに組み込んで毎日定期的にレンタルサーバー上からバックアップファイルをDLしてくることも可能です。

でも、普通のWebページですらSSL対応が当たり前となった今日この頃、暗号化も何もされていないFTPでバックアップファイルをDLするのはちょっと怖いですよね。特にデータベースとなるとユーザーのログイン情報等を格納していることもあるでしょうし、それがネットワーク上を平文で流れるかと思うと恐ろしくなります。

SFTP接続でダウンロードするバッチ処理

レンタルサーバー側がSSH接続を許しているのなら、psftp.exeを使うのが簡単でしょう。

オープンソースで提供されているSSHクライアントPuTTYに含まれているコマンドなのですが、その利便性から下記のページにて、psftp.exe単体のダウンロードも可能となっています。

Alternative binary filesの下にあるpsftp.exeをダウンロードすればすぐ使えます。
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

■psftpの使用例

C:\>psftp ユーザー名@e1.valueserver.jp -pw パスワード -b command.txt

前述したftpコマンドと同じくバッチ処理はできるのですが、微妙に使い方が異なります。

psftpの場合はコマンドファイル内にログイン情報を書けないため、オプションで直接、ユーザー名/ホスト名/パスワードを指定することになります。

接続後に実行するコマンドはcommand.txtに書けばOKです。

■command.txtの例

cd /virtual/ユーザー名/backup
get backup.zip

ログイン情報は書かないのでシンプルにディレクトリ移動とgetコマンドだけですね。

もちろん mget *.zip 等でもOKです。

ちゃんと動作することが確認できたら delete *.zip を追記してサーバーのスペースを圧迫しないようにするのも良いと思います。

psftp の Store key in cache? (y/n) の回避方法

psftpを初回実行時は必ず、Store key in cache? (鍵をキャッシュするか否か)を聞かれます。

一度 y を入力しておけば二度目からは何も聞かれなくなりますが、サーバーのタスクスケジューラーで使うにはちょっと具合が悪いですし、キャッシュしたくない場合もあるでしょう。

そういうときは、下記のように echo n をパイプ処理で渡してあげれば自動的に n が入力され、バッチ処理が中断しなくなります。

echo n | psftp ユーザー名@e1.valueserver.jp -pw パスワード -b command.txt

psftpに限らず、対話型のコマンドではよく使う手法ですね。

まとめ

前々回の記事「WSHでブラウザを自動操作する」ではVALUE SERVERのコントロールパネルへログインし、SSH登録するまでを自動化しました。

次に「PHPでファイルとDB(PostgreSQL)をバックアップ」でレンタルサーバー上のファイルとDBのバックアップも自動化。

そして今回はローカルのWindows PC側でFTPコマンド、あるいはpsftpコマンドを使うことで、レンタルサーバー上にあるバックアップファイルをダウンロードする処理も自動化できました。

ファイル名に日付(YYYYMMDD等)を付けて保存しておけば、ローカルのHDDが許す限り、過去何ヶ月分ものバックアップを保存しておけますし、これだけでらくちんな全自動バックアップシステムが構築できますね。

ハードウェアのトラブルによるファイル消失というのはそう滅多にあるものではありませんが、ユーザー側の操作ミスでサーバー上のファイルを消してしまうことが(少なくともぼくの場合は)けっこうあり、やっちまった!と思った後にバックアップがあってホッとしたケースは過去に数え切れないほどあります。

最初のうちは気がついたときに手動バックアップしておけばいいや~で済むかも知れませんが、そうして何度も手動操作をするよりも、最初の1回だけ自動化の仕組みを作る手間をかけたほうが、後々楽が出来るかなと思います。

今回はてっとり早くFTPコマンドで済ませましたが、以前の記事で書いたとおり、出来るだけ全部PHP 1本で済ませたいなぁという思いもあり、うちではPHPでSFTP接続しています。これについてはコーディング云々よりも、PHPでSSHを使える準備を整えるほうが面倒くさいので、そのへんも含めて別記事にまとめたいと思います。