17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コピペで使えるLFTPスクリプト

Posted at

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といったものも活用できそうです(そちらの方がメジャーかも...?)
今回は使う機会があったのでまとめてみました。誰かの役に立つと良いなあ。

17
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?