lftpについて

概要

次の3点:

  1. ファイル転送系のCUIでいろいろ使える(FTP, SFTP, FTPSなどファイル転送系のプロトコルはだいたいサポートされている
  2. mirrorコマンドでリモート/ローカルでファイル・ディレクトリを丸ごと同期することができる(rsync)
  3. 並列転送をサポートしているので,LONG FAT PIPEな環境でも高速にファイルが転送できる.

インストール

だいたいのプラットフォームでパッケージが用意されている. macOSだとbrewで,ubuntuだとapt-getで瞬時に導入できる.おそらくCentOSのyumでもパッケージが提供されているはず.

macOS$  brew install lftp

ubuntu$ sudo apt-get install lftp

Hellow World!

1. FTP系のコマンド

FTPコマンドがカバーされている.

  • get
  • put
  • mput
  • lcd
  • !pwd
  • その他もろもろ

ということで,FTP意外のプロトコルを使う場合でも,基本的にコマンド操作を統一化できる.webホスティングサービスによっては,ファイル転送で許可されているプロトコルが異なるのだが,lftpを使っておけばそこら辺を吸収することができる.引越しが楽になる.

あとは,SFTPがサポートされているので,サーバ側にsshd(+sftpの許可設定)を立てておけば,セキュアにファイル転送が可能になるのがうれしい.tab補完も効いているので,shellでインタラクティブに作業するときには助かる.

例えばsshdが立っているリモートのサーバ(remote.site.com)からhtmlファイルをダウンロードする(mgetする)には,以下のような感じになる.

$ lftp -u user123 sftp://remote.site.com
Password: <= パスワード入力

lftp [email protected]:~> ls
drwxr-xr-x    4 user123 user123     4096 Mar 21 13:56 .
-rw-------    1 user123 user123     9296 May 31 12:54 .bash_history
-rw-r--r--    1 user123 user123      220 Jan  5 00:03 .bash_logout
-rw-r--r--    1 user123 user123     3512 Jan  5 00:03 .bashrc
-rw-r--r--    1 user123 user123      675 Jan  5 00:03 .profile
-rw-------    1 user123 user123     5944 Mar  2 05:56 .viminfo
-rw-r--r--    1 user123 user123      316 Jan  5 07:10 .vimrc
-rw-r--r--    1 user123 user123    10701 Jan  5 08:04 index.html
drwxr-xr-x    6 user123 user123     4096 Mar  2 05:56 script
drwxr-xr-x    7 user123 user123     4096 Jan  5 07:09 script.git

lftp [email protected]:~> !pwd
/Users/user123

lftp [email protected]:~> pwd
sftp://[email protected]/home/user123

lftp [email protected]:~> mget *.html
10701 bytes transferred      
			
lftp [email protected]:~> !ls |grep html
index.html

2. mirrorする

lftpの強みはmirrorコマンドがあることだと思ってる.つまり,rsyncコマンドのようにリモート-ローカル間でファイルの同期ができると言うことだ.あるディレクトリ配下を丸ごとローカルにコピーすることや,逆にバックアップ目的でリモートサイトにファイルを一括で転送することができる.また,ネットワークの不具合でファイル転送が中断してしまったとでもお構いなし.再度接続して"mirror"すれば途中から再開される.resumeという機能も兼ねるということだ.

# リモートのディレクトリ・ファイルをローカルにミラーする(ダウンロード)
lftp [email protected]:~> mirror

# ローカルのディレクトリ・ファイルをリモートにミラーする(アップロード)
lftp [email protected]:~> mirror -R

ここまででも,おもてなし感はとってもあるが,このmirrorコマンドには並列化オプションが付いてくる.つまり,mirrorする際に複数のセッションを張って並列転送をしてくれるということだ.クライアント-サーバ間が国内(TTL<20msec)だと対して気にならないが,例えば日本-米国間(TTL>100msec程度)だとLONG FAT PIPE問題でTCPシングルセッションだと低速になるので,この並列化がとっても役に立つ.

# リモートのディレクトリ・ファイルをローカルにミラーする(ダウンロード)
lftp [email protected]:~> mirror --parallel=10

3. ファイル記述で自動化

ファイルに記述しておいて,cronなどを使って,外部から呼び出すこともできる. 例えば,さっきやったmgetをファイルに書いておいてbashから呼び出せば,同じことができる.

lftp_example.sh

#!/bin/bash

REMOTE_DIR="/home/user123"
LOCAL_DIR="/Users/user123"

/usr/local/bin/lftp <<END
open -u user123,ログインパスワード sftp://remote.site.com
cd $REMOTE_DIR
lcd $LOCAL_DIR
mget *.html

そうして,シェルから呼び出して実行.

$ chmod +x lftp_example.sh
$ ./lftp_example.sh

上記はパスワードが平文になっているのでよくない例であるが,そこは公開鍵認証を使うなどすればいい.

4. ユースケース

Dropboxクライアントみたいに使う

そのうち書く

5. 参考リンク