lftpを使用して自動同期する

2021-06-30

FTPサイトでlftpコマンドでファイル・ディレクトリを同期する

lftpはFTPサイトでファイルやディレクトリをダウンロードできたりアップロードできたりするコマンドです。通常のFTPクライアントではrsyncのように特定のディレクトリを同期(ミラーリング)する不向きですが、「lftp」を利用すると同期(ミラーリング)ができます、rsyncのように同期をしたいがSSH接続できない場合に役に立ちます

「lftp」には、下記のコマンドでFTPサイトに接続できます。もちろんユーザ名・パスワード認証にも対応しています。ログイン後は対話式でコマンドを入力してファイルのアップロードやダウンロードができます

$ lftp open -u (username),(password) ftp://(URL)

# 下記の設定の場合のコマンド
# ユーザー:admin , パスワード: deo078s FTPホス名:ftp://ftp example.com
$ lftp open -u admin,deo078s ftp://ftp example.com

ftpコマンドののオプションや対話式のコマンドは、日経 xTECHの記事で紹介されている、【lftp】FTPサーバに接続してファイルを転送する で紹介されているのでそちらでご確認下さい

 

FTPでrysncのように同期する方法

「lftp」のオプションでは、「mirror」、「only-newer」、「delete」というオプションを使用するとrysncのようにミラーリングできます。

  • 「mirror」は、指定したディレクトリとローカルディレクトリを同期します
  • 「only-newer」は、新しいファイルのみダウンロードします
  • 「delete」は、リモート先に存在しないファイルは削除します

上記のオプションを使用すると、rysncのようにミラーリングできますし、「-X」のオプションを利用すれば、対象ファイル,対象ファイル除外指定ができます

シェルスクリプトで下記のような、ディレクトリを同期するスクリプトをサンプルとして作成しました。

public_html/
 ├ www1/
 ├ www2/
 ├ test/
 │ ├ upload/
 │ ├ images

【仕様など】

  • public_html/test/upload は除外ディレクトリとしてダウンロードしない
  • rsyncのようにミラーリングする。ダウンロード先に無いファイルは削除
  • 「-v」は、ログは詳細に表示する
  • 「parallel」で、4並列でダウンロードする
#!/bin/bash

#FTPのダウンロードするディレクトリ
REMOTE_DIR="/public_html/"
#同期するローカルディレクトリ
LOCAL_DIR="/home/admin/backup/"
#FTP接続先
SERVER_FTP=ftp example.com
#除外するディレクトリ(ダウンロードするディレクトリからのパス)
EXCLUDE_DIR=test/upload
#ログインユーザー
USER=admin
#パスワード
PASS=deo078s

/usr/bin/lftp <<END
open -u ${USER},${PASS} ftp://${SERVER_FTP}
mirror --delete --parallel=4 --only-newer -X ${EXCLUDE_DIR} ${REMOTE_DIR} ${LOCAL_DIR}
quit
END