[mac]lftpコマンドでFTPサーバに一括アップロードをする


[まとめ] 現在開催中のKindleセール情報はこちら

最近あまり見かけなくはなったのですが、時々FTPによるアップロードが必要になることがあります。

静的htmlのようなシンプルなものだと「Cyberduck」等のFTPクライアントを使って手動アップロードをするのでも問題ないのですが、サーバサイドが絡むアプリケーションをアップロードする場合、毎回更新のあったファイルだけを手動アップロードする運用だと結構大変ですし、更新漏れで思わぬ事故が発生する可能性も高くなります。

できればコマンドラインから一括アップロードしたいです。

調べてみたところコマンドラインFTPクライアントであるLFTPを発見しました。

そこで、lftpを使ってFTPサーバに一括アップロードできるようにしてみました。

1. lftpコマンドインストール

brewで一発インストールできます

brew install lftp

2. 検証用のFTPサーバを立てる

Vagrantを使って適当な仮想マシンを作成し、FTPサーバをインストールします。

2.1 CentOSにvsftpdをインストール

# インストール
sudo yum -y install vsftpd

# 起動
sudo /etc/init.d/vsftpd start

2.2 初期設定

ユーザリストに存在するユーザがFTPアップロードできるように設定を変更します。

sudo vim /etc/vsftpd/vsftpd.conf

# 以下の設定を変更
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

vagrantユーザをホームディレクトリ以下しか読み書きできないように設定

sudo vim /etc/vsftpd/chroot_list

vagrant

アクセス許可対象にvagrantユーザを追加

sudo vim /etc/vsftpd/user_list

vagrant

FTPサーバ再起動

sudo /etc/init.d/vsftpd restart

2.3 macから接続

適当なファイルをアップロードして削除してみます。

ftp vagrant@192.168.30.10
put test.txt
del test.txt

無事にFTPサーバを立てることができました。

3. lftpコマンドでアップロードしてみる

以下のようなサンプルのディレクトリを作成しました。

tree ftp_sample -a

ftp_sample
├── .exclude_file
├── dir
│   └── test.txt
├── exclude_dir
│   └── 1.txt
└── test.txt

.exclude_fileとexclude_dir以下のファイルをアップロード対象外にして、リモートサーバ(192.168.30.10)のftp_sample以下にアップロードしたい場合は以下のようなコマンドを実行します。

cd ftp_sample
lftp -u vagrant -e "mirror --dry-run -v -R -p -L -X .exlude_file -X exlude_dir/ . ftp_sample/.; exit;" 192.168.30.10

-eに実行したいコマンドを書けば、直接コマンドを実行できます。

mirrorを実行することで対象ディレクトリを一括でアップロードすることができます。

mirrorアップロード後、exitでlftpを終了しています。

mirrorにはオプションをつけることで細かな制御ができます。

オプション 説明
–dry-run 仮実行
-R アップロードとして扱う。-Rなしだとダウンロードになる
-v 詳細表示
-p ファイルのパーミッションを設定しない
-L シンボリックリンクをファイルとしてダウンロード
-X アップロード対象外にしたいファイル、ディレクトリをグロブパターンで指定

これでlftpコマンドを使って一括FTPアップロードを行うことが可能になりました。

複雑なものはシェルスクリプトにまとめて、シェルスクリプトからlftpコマンドを呼び出すようにすると良さそうです。

参考

[まとめ] 現在開催中のKindleセール情報はこちら