テックブログ

技術ネタ

lftpでsftp

こんにちは、阿部です。

性懲りもなく技術部に舞い戻ってまいりました。
よろしくお願いします。

3月ですね、春ですね、花粉ですね。

ボクも花粉症でした。
過去形ですが、治ったというかマヒしたというか。

20代が一番症状が重かったような気がします。
くしゃみ&鼻水が止まらず、家の中でも点鼻薬を持ち歩いていた記憶があるのですが、
いつの間にか「あれ?そーいえば・・・」って感じで。。。
たぶん鼻がバカになったのだと思います。

今回は “lftp” というファイル転送コマンドを紹介します。

“lftp” の作者は Alexander V. Lukyanov 、ロシアの方みたいです。

本家サイト http://lftp.yar.ru/ を覗いてみると
2017年10月にリリースされた バージョン4.8.3 が最新版のようですね。

まずは自分の環境で lftpコマンド が使えるか確認します。
ボクの環境は CentOS 6.9 です。

[root@nabe5150 ~]# rpm -q lftp
lftp-4.0.9-14.el6.x86_64

[root@nabe5150 ~]# which lftp
/usr/bin/lftp

ちょっと古いですが バージョン4.0.9 が入ってます。
入っていなかったら “yumコマンド” で一発インストールできます。

どーしても最新版じゃなきゃイヤダッ!という人は
本家サイトにRPMバイナリが用意されているので、そちらをどーぞ。
“make install” したい人はソースコードをGETして頑張って下さい。


lftp” は一応FTPクライントですが、sshサーバに対して “sftp” できちゃったりします。

   「最初からsftpすればイイじゃん」。。。ごもっともです。

ただですね、”lftp” で “sftp” したくなるときもあるんです。

cronで毎日バックアップ取ってファイルサーバへ “sftp” 転送したいときとか。
シェル書いてexpectしてる人も多いと思いますが、”lftp” を使えば1行で終わります。

コマンドラインで書くとこんな感じです。

[root@nabe5150 ~]# PASSWORD="hogehoge" ; /usr/bin/lftp sftp://abe:${PASSWORD}@192.168.1.152 -e "mput /home/abe/*.gz; bye"

※パスワード直書きしていますが、くれぐれもマネしないように!

何をしているか、分解してみます。

PASSWORD="hogehoge" ;

変数”PASSWORD” に sshユーザ”abe”のパスワード”hogehoge” を格納して
“;” の次に続くコマンドに引き渡し

/usr/bin/lftp

“lftp” を呼び出してsftpのプロキシ代わりに使います

sftp://abe:${PASSWORD}@192.168.1.152

変数”PASSWORD” を受け取って “192.168.1.152” へ sshユーザ”abe” で “sftp”接続

-e "mput /home/abe/*.gz; bye"

ローカルのgzファイル群 “/home/abe/*.gz” をまとめてアップロード
“-e” は “lftp” のコマンドオプション、”mput” はワイルドカード指定できるputコマンド
“mput”が完了したら “bye” でEXIT

   「素直にsftpすればイイじゃん」。。。

続けます。

“lftp” は大量のパラメータを持っていて “/etc/lftp.conf” という設定ファイルを持っています。
パラメータ値を変更して固定したいときは”lftp.conf”で設定することをお奨めします。

次のコマンドを叩いてみて下さい。

[root@nabe5150 ~]# lftp -e "set -d; bye"

今、目の前を流れた連中が “lftp” のパラメータたちです。200個を超えます。

ボクが “lftp” で “sftp” するときに変更するパラメータは、だいたい次の3つです。

set net:max-retries                     1000 --->  1
set net:reconnect-interval-base           30 ---> 10
set sftp:connect-program         "ssh -a -x" ---> "ssh -a -x -o ConnectTimeout=30"

パラメータの意味は、そこはかとなく通じると思いますので省略しますが
“set net:max-retries 1000” コイツだけは要注意です。

“lftp” は相手サーバに接続できなかったとき “1000回” も再接続に挑戦してくれます。
思い切って再接続回数を減らしましょう。

一時的にパラメータを変更したいときは、
“-e”オプションを付けてコマンドラインから投げることができます。

[root@nabe5150 ~]# PASSWORD="hogehoge" ; /usr/bin/lftp sftp://abe:${PASSWORD}@192.168.1.152 -e "set net:max-retries 1; set net:reconnect-interval-base 10; set sftp:connect-program \"ssh -a -x -o ConnectTimeout=30\"; mput /home/abe/*.gz; bye"

長いですね。あえて改行はしませんでした。
“-e”オプションダブルクォーテーション使うときはエスケープしないと暴れます。

すごくザックリとした紹介になってしまいましが、”lftp” はもっと使えるヤツなんです。
また機会があればミラーリングとかも取り上げてみたいと思います。

ではまた。

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください