lftpコマンドを使ってFTPサーバとデータを同期する方法
使用している環境について
WSL を使って ubuntu をインストールしています。
バージョンは次のとおりです。
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
ubuntu の場合は、cat /etc/lsb-release
コマンドでディストリビューションのバージョンを調べることができます。
lftp のインストール
lftp コマンドを使用するためにはインストールする必要があります。
次のコマンドを実行するとインストールできます。
sudo apt install lftp
実行方法
lftp を使って対話型でサーバへファイルをアップロードする方法もありますが、今回はスクリプト実行する方法を紹介します。
lftp のスクリプトファイル書いておき、実行時にそのファイルを指定することでスクリプト実行できます。
実行方法は下記のような形になります。
lftp -f [スクリプトファイル名]
まず、適当なファイル名でスクリプトファイルを作成して、処理を記述します。
vi scriptname
下記のように記述します。
これは、FTP サーバからローカルへファイルをダウンロードしてくる例です。
open -u user,pass xxx.xxx.xxx.xxx
mirror /server/path /local/path
echo end
close
quit
スクリプトファイルを作成したら、lftp コマンドのパラメータにスクリプトファイルを指定して、実行します。
lftp -f scriptname
スクリプトファイルの簡単な説明
スクリプトファイルに記述するコマンドを説明します。open
は FTP サーバへ接続します。
open -u [ユーザー名],[パスワード] [FTPサーバのIPかホスト名]
mirror
は、同期元の内容を同期先へ処理を行います。
mirror [オプション] [同期元] [同期先]
実行前のイメージでは次のようになっています。
同期元 | 同期先 |
---|---|
fileA | fileC |
fileB |
実行すると次のようになります。
同期元 | 同期先 |
---|---|
fileA | fileA |
fileB | fileB |
fileC |
ミラーリングを試行する
間違って記述してしまったスクリプトを実行してしまうと困ったことになります。
そのため、--dry-run
オプションを使って試行できます。
mirror --dry-run --log=test.log /server/path /local/path
--log=test.log
オプションを付けておくと、指定した場所に試行した結果のログが出力されます。
ログの内容を確認して、スクリプトの記述に間違いが無いか確認しましょう。
FTP サーバへデータをアップロードする
「-R」オプションを付けることで、ローカルのデータを FTP サーバへアップロードできます。
この例では/local/path
の内容を/server/path
にアップロードしています。
mirror -R /local/path /server/path
さらに、「–delete」オプションを付けることで、同期先にのみ存在するファイルを削除する事ができます。
この例では、サーバにのみ存在するファイルは削除され、ローカルと同じ状態になります。
mirror -R --delete /local/path /server/path
--only-newer
オプションを付けると、更新されているファイルだけがアップロード対象になります。
mirror -R --delete --only-newer /local/path /server/path
特定のファイルを対象外にしたい
-X
オプションを使用すると特定のファイルやディレクトリを除外する事ができます。
mirror -R -X .git/ -X .desktop.ini -X .DS_Store --delete --log=lftp.log /local/path /server/path
このようにしておくと、.git/
ディレクトリ、 .desktop.ini
ファイル、.DS_Store
ファイルが同期対象から除外されます。
最後に私がよく使うスクリプトを紹介
ローカルの画像ファイルディレクトリとサーバのディレクトリを同期しています。
スクリプトの内容。
open -u user,pass xxx.xxx.xxx.xxx
mirror -R -X .desktop.ini -X .DS_Store --delete --log=lftp.log /local/path /server/path
echo end
close
quit
実行するときは、lftp -f lfptscript
のようなコマンドを書いたmirror.sh
シェルスクリプトを実行しています。