[mac]lftpコマンドでFTPサーバに一括アップロードをする
最近あまり見かけなくはなったのですが、時々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 [email protected]
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コマンドを呼び出すようにすると良さそうです。