LFTPとは
コマンドでファイルの転送操作をできるプログラム。
FFFTPやFileZillaといったFTPクライアントソフトを介さずに転送できる。
サーバからローカルへのダウンロードも、ローカルからサーバへのアップロードも可能。
この記事ではコマンドひとつで一定のファイル転送を行うスクリプトを作成します。
事前準備
まずはLFTPをインストールします。homebrewを使っている場合は下記でOKです。
brew install lftp
任意のディレクトリ内で、スクリプトを書くファイルを作成します。
touch lftp-script.sh
※ファイル名は良しなに変えて大丈夫です。
作成したら、chmod a+x ./lftp-script.sh
で実行権限を付与しておきましょう。
コピペで使えるスクリプト
作成したlftp-script.sh
に以下を貼り付けます。
#! /bin/sh
HOST=サーバのホスト名
USERNAME=サーバのユーザー名
PASSWORD=サーバのパスワード
REMOTE="サーバのディレクトリまたはファイルまでのパス"
LOCAL="ローカルのディレクトリまたはファイルまでのパス"
ダウンロードでもアップロードでも共通で使える変数です。
値をサーバ接続に必要な情報やサーバ・ローカルのパスに書き換え、変数に格納します。
以降は用途に合わせて使ってください
目的に沿うものを、先ほどの変数に続けて記載してください。
# サーバからローカルへデータをダウンロードさせたい場合
FROM="$REMOTE"
TO="$LOCAL"
lftp <<EOF
open -u $USERNAME,$PASSWORD $HOST
set ssl:check-hostname false
mirror \
--dry-run \
$FROM \
$TO \
exit \
EOF
# ローカルからサーバへデータをアップロードさせたい場合
FROM="$LOCAL"
TO="$REMOTE"
lftp <<EOF
open -u $USERNAME,$PASSWORD $HOST
set ssl:check-hostname false
mirror \
--dry-run \
--reverse \
$FROM \
$TO \
exit \
EOF
※ダウンロード・アップロードどちらのスクリプトも揃えたい場合は、ファイルを分けてお使いください。
※誤操作に備えてファイル転送処理を実行させない--dry-run
オプションを付けています。実際にファイルの転送を行いたい段階で--dry-run
の行を削除してください。
※実現したいのは単純なダウンロード・アップロードではない?後述の使う機会がありそうなmirrorのオプションまとめでお目当ての結果が得られそうかチェックしてみてください。
スクリプトを実行します
下記で実行。
./lftp-script.sh
スクリプトを実行して起きたエラー
SSL証明書のホスト名とサーバのホスト名が一致していないとのエラー
mirror: Fatal error: Certificate verification: subjectAltName does not match ‘ホスト名’
SSL証明書のsubjectAltNameとサーバのホスト名が違っているようです。
※subjectAltName...ホスト名をいくつも登録しておけるものらしい
mirrorコマンドの手前に下記を付ければOK。
set ssl:check-hostname false
これは「ホスト名のチェックはしない」という指示です。
SSL証明書とサーバのホスト名が一致していないケースはよくあるので、遭遇しやすいエラーかと思います。
※このエラーを検索すると以下のような対処がヒットしますが、ホスト名相違のエラーを下記で解決するのは誤りだと思いますので、ご注意ください。
set ssl:verify-certificate no
→ 「SSL証明書が有効な証明書かどうかを確認しない」という設定のようです。SSL証明書の確認自体をやめたい訳ではないので、正しくないと思います。
set ftp:ssl-allow false
→ 「SSL接続をしない」という設定のようです。SSLで接続してほしいので、この指定はよくなさそうです。
使う機会がありそうなmirrorのオプションまとめ
mirror
コマンドの後ろに記述します。
オプション | 短縮形 | 指定内容 |
---|---|---|
--dry-run | なし | ファイル転送自体は行わず ログのみを出力する |
--reverse | -R | ローカルからサーバへ データをアップロードする |
--delete | -e | 転送元に存在しない ファイルが転送先にある場合、 転送先からそのファイルを 削除する |
--only-newer | -n | 転送元のデータのうち、 更新日時が転送先より新しい ファイルのみを転送先へ 転送する |
--only-missing | なし | 転送元にしか存在しない ファイルのみを転送先へ 転送する |
--exclude-glob 拡張子 | -X | *.zip のように指定する。 転送対象から特定の拡張子の ファイルを除外する ※複数回指定できる |
--parallel=数字 | -P | 転送処理を並列に行う。 いくつを並列処理するかを 指定する ※処理速度を速める為の機能 |
--verbose | -v | 処理したファイルの 処理結果を表示する |
参考にしたページ
LFTP公式マニュアル - http://lftp.yar.ru/lftp-man.html
lftp で "Certificate verification: certificate common name doesn't match requested host name" というエラー - https://qiita.com/yuki12/items/b0a9e7efa79a80309c0b
あとがき
ファイルの転送操作にはLFTPの他にLinuxコマンドのrsyncやSSHやGit hooksといったものも活用できそうです(そちらの方がメジャーかも...?)
今回は使う機会があったのでまとめてみました。誰かの役に立つと良いなあ。