sftp コマンドの使い方|基本構文・オプション一覧・実行例を解説

コマンドリファレンス

sftp コマンドは、SSH の暗号化通信を利用してリモートサーバとファイルをやり取りできる対話型のファイル転送コマンドです。従来の ftp と似た操作感でありながら通信内容が暗号化されるため、パスワードやファイルの中身を盗聴されずに安全に転送できます。この記事では sftp コマンドの基本構文からオプション、対話モードのコマンド、実行例までを実際の動作確認を交えてまとめます。

sftp コマンドとは

sftp(SSH File Transfer Protocol)は、OpenSSH に標準で含まれるファイル転送コマンドです。ssh コマンドと同じ SSH 接続(デフォルトポート 22)を利用するため、専用のポート開放や証明書設定を追加する必要がなく、鍵認証・パスワード認証もそのまま流用できます。

  • 接続後は ftp と同様の対話シェル(sftp> プロンプト)でファイル操作ができる
  • 通信は SSH と同じ暗号化トンネルを通るため、平文の ftp より安全
  • -b オプションでバッチファイルを渡せば、対話操作なしで自動実行できる

基本構文(Syntax)

sftp [オプション] [USER@]HOST
sftp [オプション] [USER@]HOST:REMOTE_PATH [LOCAL_PATH]
sftp [オプション] -b BATCH_FILE [USER@]HOST

2つ目の書式のように HOST:REMOTE_PATH を指定すると、対話モードに入らず1回のコマンドでファイルを取得できます(後述の実行例参照)。

主なオプション一覧

オプション説明使用例
-P PORT接続ポートを指定(デフォルト:22)sftp -P 2222 user@host
-i KEY秘密鍵ファイルを指定sftp -i ~/.ssh/id_rsa user@host
-b FILEバッチモード(スクリプトで自動実行)sftp -b batch.txt user@host
-rget/put をディレクトリごと再帰的に実行(対話コマンドの get -r / put -r と同じ働き)sftp> get -r dir1
-C圧縮を有効化sftp -C user@host
-q冗長なメッセージを表示しないsftp -q user@host
-vデバッグ情報を表示(接続トラブルの切り分けに便利)sftp -v user@host
-o OPTIONssh の接続オプションを指定(ConnectTimeout など)sftp -o ConnectTimeout=5 user@host

主な対話モードのコマンド

コマンド説明使用例
lsリモートディレクトリの一覧表示sftp> ls
cd DIRリモートディレクトリを移動sftp> cd /var/www
lcd DIRローカルディレクトリを移動sftp> lcd /tmp
pwdリモート作業ディレクトリを表示sftp> pwd
lpwdローカル作業ディレクトリを表示sftp> lpwd
get FILEリモートファイルを取得sftp> get remote.txt
get -r DIRリモートディレクトリを再帰的に取得sftp> get -r dir1
put FILEローカルファイルをアップロードsftp> put local.txt
put -r DIRローカルディレクトリを再帰的にアップロードsftp> put -r dir1
mget FILES複数ファイルを取得sftp> mget *.log
mput FILES複数ファイルをアップロードsftp> mput *.txt
rm FILEリモートファイルを削除sftp> rm old.txt
mkdir DIRリモートディレクトリを作成sftp> mkdir backup
bye または exitsftp を終了sftp> bye

実行例

リモートサーバへ接続

sftp user@example.com

出力例:

Connected to example.com.
sftp>

ファイルをリモートから取得(get)

sftp> get remote.txt
Fetching /home/user/remote.txt to remote.txt

ディレクトリを再帰的に取得(get -r)

サブディレクトリを含むフォルダをまとめて取得したい場合は -r を付ける。

sftp> get -r dir1
Fetching /home/user/dir1/ to dir1
Retrieving /home/user/dir1
Retrieving /home/user/dir1/subdir

ファイルをリモートへアップロード(put)

sftp> put local.txt
Uploading local.txt to /home/user/local.txt

複数ファイルをまとめて取得(mget)

sftp> mget *.log

対話モードを使わず1コマンドで転送する

HOST:REMOTE_PATH の書式を使うと、sftp> プロンプトに入らず1回のコマンドでファイルを取得できる。シェルスクリプトに組み込みやすい。

sftp user@example.com:/home/user/remote.txt ./remote.txt

バッチモードで自動実行

echo "get remote.txt" > batch.txt
sftp -b batch.txt user@example.com

エラー例(接続失敗)

sftp user@wronghost

出力例:

ssh: connect to host wronghost port 22: Connection refused
Connection closed

エラー例(鍵認証失敗)

公開鍵が authorized_keys に登録されていない鍵で接続すると、次のように拒否される。

user@example.com: Permission denied (publickey,keyboard-interactive).
Connection closed

sftp 使用時の注意点

  • sftp は SSH と同じポート(デフォルト 22)を利用するため、ファイアウォール設定が ftp より簡単。
  • サーバ側で sshdsftp サブシステムを有効化している必要がある(/etc/ssh/sshd_configSubsystem sftp ... 行)。無効化されていると接続自体が拒否される。
  • get / put はデフォルトで単一ファイルのみが対象。ディレクトリを転送する場合は -r を付け忘れない。
  • 取得したファイルのパーミッションはローカルの umask に依存するため、実行権限などが必要なファイルは転送後に chmod で確認する。
  • 大量ファイルを毎回同じ内容で同期したい場合は、差分転送に強い rsync コマンドの方が効率的。

よくある質問(FAQ)

sftp と ftp の違いは?

ftp は通信が暗号化されないため、ID・パスワードやファイル内容が盗聴されるリスクがある。sftp は SSH の暗号化トンネルを使うため、同じ操作感のまま安全に転送できる。特別な理由がなければ sftp を使う。

sftp コマンドで接続できないときは?

まず -v オプションを付けて接続し、どの段階で失敗しているかを確認する。ポート・ファイアウォール・鍵の登録状況を切り分ける手順はSSH接続できないときのチェックリストを参照。

ディレクトリごとコピーするには?

対話モードで get -r DIR または put -r DIR を使う。サブディレクトリも含めて再帰的に転送される。

sftp・scp・rsync はどう使い分ける?

1回だけまとめてコピーするならscp コマンド、対話的にファイルを探しながら転送するなら sftp、差分だけを繰り返し同期するならrsync コマンドが向いている。より詳しい比較はscp を使ってきた人向け|今後は SFTP・rsync を選ぶ理由も参考になる。

関連コマンド

  • ssh : リモート接続
  • scp : SSH を利用した一括ファイル転送
  • rsync : 差分同期に優れた転送ツール(SSH利用可能)
  • ftp : 暗号化なしの古いファイル転送コマンド(非推奨)

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント