
lftp で SFTP サーバーに接続する - 鍵認証・ポート指定・mirror での同期まで
当サイトは Amazon.co.jp を宣伝しリンクすることで紹介料を得る手段を提供する、Amazonアソシエイト・プログラムの参加者です。価格・在庫はリンク先の最新情報をご確認ください。
サーバーへのファイル転送で scp や rsync を使う場面は多いですが、対話的にディレクトリを行き来しながら、まとめて転送したいときに便利なのが 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に含められます。
# 対話的に接続(パスワードは後で聞かれる)
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 コマンドでも接続できます。
open sftp://user@example.comポート番号を指定する
SSH のポートが標準の22番でない場合は、URL にポートを付けるのが手軽です。
lftp sftp://user@example.com:2222内部で ssh を使う都合上、~/.ssh/config にホストごとの Port を書いておけば、URL 側での指定は不要になります(後述の「ssh の設定を活かす」を参照)。
認証の方法
パスワード認証
対話で入力するのが基本です。スクリプト化のためにコマンドラインへ書くこともできますが、ps やシェル履歴から見えてしまうため推奨しません。
# 対話入力(推奨)
lftp sftp://user@example.com
# ユーザーとパスワードを渡す(非推奨: 履歴・プロセス一覧に残る)
lftp -u user,password sftp://example.comパスワードをファイルに逃がしたい場合は、~/.netrc を使います(パーミッションは 600 に)。
machine example.com
login user
password s3cretchmod 600 ~/.netrc
lftp sftp://user@example.com # .netrc から自動でパスワードを読む公開鍵認証(推奨)
SFTP は内部の ssh が認証を担うので、いつもの鍵認証がそのまま使えます。~/.ssh/config に鍵を設定していれば追加の指定は不要です。鍵を明示したいときは、sftp:connect-program に ssh のオプションを足します。
# 鍵を明示して接続(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で未知のホスト鍵を自動的に受け入れる(利便性は上がるが中間者攻撃の検知を捨てるので、信頼できる経路・使い捨て環境に限る)
# 自動承認して接続(安全性は下がる。用途を選ぶこと)
lftp -e 'set sftp:auto-confirm yes' sftp://user@newhost.example.comセキュリティ面の考え方はOpenSSH 10.4 のセキュリティ強化も参考になります。
ディレクトリをまとめて転送する(mirror)
lftp の主役機能が mirror です。ローカルとリモートのディレクトリツリーを丸ごと同期できます。
# リモート → ローカル(ダウンロード)
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 などもあり)で指定します。
# まず何が起きるか確認
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分です)。
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)などを一括で解決できます。
Host myserver
HostName example.com
Port 2222
User deploy
IdentityFile ~/.ssh/id_ed25519
ProxyJump bastion.example.com# config の Host 名でそのまま接続(ポートも鍵も踏み台も config 任せ)
lftp sftp://myserver踏み台越しの接続や多段 SSH も、ssh 側の ProxyJump に寄せれば lftp からは意識せずに使えます。
スクリプトで自動化する
-c(コマンド列を実行)や -e(接続後にコマンド実行)で、非対話のバッチ処理にできます。デプロイやバックアップに便利です。
#!/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/configのPortが優先される構成になっていないか確認します。config に寄せるのが確実です sftpとscp/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 "..."+鍵認証で、秘密情報を書かずに実現する
scp や rsync で足りる場面も多いですが、対話的な探索とツリー同期を1つのツールで完結したいときに lftp は強力です。まずは ssh が通る状態を作り、そのうえで sftp:// を叩いてみてください。


