lftp で SFTP サーバーに接続する - 鍵認証・ポート指定・mirror での同期まで

lftp で SFTP サーバーに接続する - 鍵認証・ポート指定・mirror での同期まで

作成日:
読了:12
更新日:
この記事を読む人におすすめPR / Amazonアソシエイト

当サイトは Amazon.co.jp を宣伝しリンクすることで紹介料を得る手段を提供する、Amazonアソシエイト・プログラムの参加者です。価格・在庫はリンク先の最新情報をご確認ください。

サーバーへのファイル転送で scprsync を使う場面は多いですが、対話的にディレクトリを行き来しながら、まとめて転送したいときに便利なのが lftp です。FTP クライアントとして有名ですが、SFTP(SSH File Transfer Protocol)にも対応しており、mirror による同期や自動リトライなど、日常運用に効く機能が揃っています。この記事では、lftp で SFTP サーバーに接続する方法を実例つきで整理します。

NOTE

本記事は lftp 4.9.3(2024年11月8日リリース、2026年7月時点の最新)で確認しています。lftp の SFTP は内部で ssh を起動して通信する実装(設定 sftp:connect-program の既定値は ssh -a -x)なので、普段の ssh の設定・鍵・~/.ssh/config がそのまま効くのが最大のポイントです。

まず最短の接続方法

URL スキームに sftp:// を使うだけです。ユーザー名はURLに含められます。

Shell
# 対話的に接続(パスワードは後で聞かれる)
lftp sftp://user@example.com
 
# 接続後は ftp/シェルのようなコマンドが使える
lftp user@example.com:~> ls
lftp user@example.com:~> cd /var/www
lftp user@example.com:/var/www> get index.html
lftp user@example.com:/var/www> bye

すでに lftp を起動している場合は、open コマンドでも接続できます。

lftp プロンプト内
open sftp://user@example.com

ポート番号を指定する

SSH のポートが標準の22番でない場合は、URL にポートを付けるのが手軽です。

Shell
lftp sftp://user@example.com:2222

内部で ssh を使う都合上、~/.ssh/config にホストごとの Port を書いておけば、URL 側での指定は不要になります(後述の「ssh の設定を活かす」を参照)。

認証の方法

パスワード認証

対話で入力するのが基本です。スクリプト化のためにコマンドラインへ書くこともできますが、ps やシェル履歴から見えてしまうため推奨しません。

Shell
# 対話入力(推奨)
lftp sftp://user@example.com
 
# ユーザーとパスワードを渡す(非推奨: 履歴・プロセス一覧に残る)
lftp -u user,password sftp://example.com

パスワードをファイルに逃がしたい場合は、~/.netrc を使います(パーミッションは 600 に)。

~/.netrc
machine example.com
login user
password s3cret
Shell
chmod 600 ~/.netrc
lftp sftp://user@example.com   # .netrc から自動でパスワードを読む

公開鍵認証(推奨)

SFTP は内部の ssh が認証を担うので、いつもの鍵認証がそのまま使えます~/.ssh/config に鍵を設定していれば追加の指定は不要です。鍵を明示したいときは、sftp:connect-programssh のオプションを足します。

Shell
# 鍵を明示して接続(ssh -i と同じ発想)
lftp -e 'set sftp:connect-program "ssh -a -x -i ~/.ssh/id_ed25519"' \
     sftp://user@example.com

-a -x は既定値(エージェント転送・X11転送に関するフラグ)に合わせたもので、そこへ -i などを追記する形が安全です。

ホスト鍵(known_hosts)の確認

初回接続では、ssh と同様にホスト鍵の確認が入ります。lftp の既定は sftp:auto-confirm no で、未知のホストは拒否されます。挙動は次のとおりです。

  • 基本: 事前に一度 ssh user@example.com で接続し、~/.ssh/known_hosts に登録しておく(最も安全)
  • 自動承認: set sftp:auto-confirm yes で未知のホスト鍵を自動的に受け入れる(利便性は上がるが中間者攻撃の検知を捨てるので、信頼できる経路・使い捨て環境に限る)
Shell
# 自動承認して接続(安全性は下がる。用途を選ぶこと)
lftp -e 'set sftp:auto-confirm yes' sftp://user@newhost.example.com

セキュリティ面の考え方はOpenSSH 10.4 のセキュリティ強化も参考になります。

ディレクトリをまとめて転送する(mirror)

lftp の主役機能が mirror です。ローカルとリモートのディレクトリツリーを丸ごと同期できます。

lftp プロンプト内
# リモート → ローカル(ダウンロード)
mirror /remote/path /local/path
 
# ローカル → リモート(アップロード。-R = reverse)
mirror -R /local/path /remote/path
 
# リモートに無くなったファイルをローカルからも消して完全同期
mirror -R --delete /local/path /remote/path
 
# 並列転送で高速化(4本並列)
mirror -R --parallel=4 /local/path /remote/path
 
# 変更があったファイルだけ(サイズ/日時で判定)、進捗も表示
mirror -R --only-newer --verbose /local/path /remote/path

--delete削除を伴うため、初回は --dry-run で対象を確認すると安全です。除外は --exclude(正規表現は --exclude-glob などもあり)で指定します。

lftp プロンプト内
# まず何が起きるか確認
mirror -R --delete --dry-run /local/path /remote/path
 
# node_modules や .git を除外してアップロード
mirror -R --delete --exclude-glob '.git/' --exclude-glob 'node_modules/' \
  /local/path /remote/path

単一ファイルなら get(取得)/ put(送信)、複数なら mget / mput、大きなファイルの分割並列取得は pget -n 8 file が使えます。

通信の安定化(リトライ・タイムアウト)

回線が不安定なときは、リトライやタイムアウトの設定が効きます(既定値はやや強気で、net:max-retries は 1000、net:timeout は 5分です)。

lftp プロンプト内
set net:max-retries 3          # 最大リトライ回数
set net:timeout 20             # 応答待ちタイムアウト(秒)
set net:reconnect-interval-base 5   # 再接続間隔の基準(秒)
set sftp:max-packets-in-flight 32   # 転送スループット調整(既定16)

恒久設定にしたい場合は ~/.lftprc(または ~/.config/lftp/rc)に set ... を書いておけば、毎回反映されます。

ssh の設定を活かす

lftp の SFTP は ssh を呼ぶので、~/.ssh/config を書いておくのが一番きれいです。ポート・鍵・踏み台(ProxyJump)などを一括で解決できます。

~/.ssh/config
Host myserver
    HostName example.com
    Port 2222
    User deploy
    IdentityFile ~/.ssh/id_ed25519
    ProxyJump bastion.example.com
Shell
# config の Host 名でそのまま接続(ポートも鍵も踏み台も config 任せ)
lftp sftp://myserver

踏み台越しの接続や多段 SSH も、ssh 側の ProxyJump に寄せれば lftp からは意識せずに使えます。

スクリプトで自動化する

-c(コマンド列を実行)や -e(接続後にコマンド実行)で、非対話のバッチ処理にできます。デプロイやバックアップに便利です。

deploy.sh
#!/usr/bin/env bash
set -euo pipefail
 
HOST="sftp://myserver"          # ~/.ssh/config の Host 名を利用
LOCAL="./dist"
REMOTE="/var/www/app"
 
lftp -c "
  open $HOST
  mirror -R --delete --parallel=4 --verbose \
    --exclude-glob '.git/' \
    $LOCAL $REMOTE
  bye
"

bash スクリプトの堅牢化はset -euo pipefail の使いどころもあわせてどうぞ。認証は鍵認証+~/.ssh/configにしておくと、パスワードをスクリプトに書かずに済みます。

WARNING

自動化でありがちな事故が、パスワードやトークンをスクリプトや環境変数に直書きしてリポジトリへコミットしてしまうことです。認証は公開鍵に寄せ、どうしても秘密情報を扱う場合は履歴に残さないよう注意してください(この手の漏洩パターンは別記事「git でシークレットを漏らす26の悪例」でまとめています)。

よくあるつまずき

  • 「接続できるのに転送が遅い」: set sftp:max-packets-in-flight 32 などで改善することがあります。回線帯域が太いのに遅いときに試す価値があります
  • 「Host key verification failed」: 事前に ssh で一度つないで known_hosts へ登録するか、用途を限って set sftp:auto-confirm yes を使います
  • ポートを URL に書いても効かない: ~/.ssh/configPort が優先される構成になっていないか確認します。config に寄せるのが確実です
  • sftpscp/ssh で挙動が違う: lftp の SFTP は ssh 経由なので、素の ssh user@host が通る状態が前提です。まず ssh 単体で接続できることを確認しましょう

まとめ

  • lftp で SFTP へは sftp://user@host[:port] で接続。lftp の SFTP は内部で ssh を使うため、~/.ssh/config・鍵・踏み台がそのまま効く
  • 認証は公開鍵+~/.ssh/config が本命。パスワードはコマンドラインに書かず、対話入力か 600 の ~/.netrc
  • mirror-R で送信、--delete で完全同期、--parallel で高速化)がlftpの主役。--dry-run で事前確認を
  • リトライ・タイムアウトは net:* 設定で調整。恒久設定は ~/.lftprc
  • 自動化は lftp -c "..." +鍵認証で、秘密情報を書かずに実現する

scprsync で足りる場面も多いですが、対話的な探索とツリー同期を1つのツールで完結したいときに lftp は強力です。まずは ssh が通る状態を作り、そのうえで sftp:// を叩いてみてください。

参考リンク

関連記事

SSH の仕組み - 鍵交換・ホスト鍵検証・公開鍵認証を一次ソースで理解する

SSH の仕組み - 鍵交換・ホスト鍵検証・公開鍵認証を一次ソースで理解する

18

リモートサーバー運用の土台である SSH プロトコルを、一次ソースの RFC 4251/4252/4253/4254(SSH-2 の Architecture / Authentication / Transport / Connection)を軸に整理します。TCP 接続からバージョン交換、KEXINIT による鍵交換と Diffie-Hellman、ホスト鍵の検証(known_hosts と TOFU の弱点)、公開鍵認証(authorized_keys と署名)、チャネルの多重化とポートフォワーディング(ssh -L / -R / -D)まで、その仕組みと OpenSSH での確認方法をインフラ担当者・開発者向けにまとめます。

set -euo pipefail とは何か - Bashスクリプト冒頭の「おまじない」を正しく理解する

set -euo pipefail とは何か - Bashスクリプト冒頭の「おまじない」を正しく理解する

11

Bashスクリプトの冒頭でよく見る set -euo pipefail を、-e(errexit)・-u(nounset)・-o pipefail の3つに分解して解説します。それぞれの意味、set -e が効かない落とし穴、IFS との組み合わせ、実践的なテンプレートまで、bash 5.3 での実挙動を確認しながら整理します。

OpenSSH 10.4 の新機能とセキュリティ修正 - sftp/scp の脆弱性対応と量子耐性への流れ

OpenSSH 10.4 の新機能とセキュリティ修正 - sftp/scp の脆弱性対応と量子耐性への流れ

11

2026年7月6日にリリースされた OpenSSH 10.4 を一次情報で整理します。悪意あるサーバによる sftp ダウンロード先のすり替え、scp のリモート間コピーでの親ディレクトリ書き込み、鍵再交換時のクライアント側 use-after-free など複数のセキュリティ修正の中身に加え、ML-DSA 44 と Ed25519 を組み合わせた実験的なポスト量子署名の追加、そして mlkem768x25519 デフォルト化・DSA 削除といった量子耐性への流れまで、実務での確認ポイントとともにまとめます。