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 |
-r | get/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 OPTION | ssh の接続オプションを指定(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 または exit | sftp を終了 | 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より簡単。- サーバ側で
sshdがsftpサブシステムを有効化している必要がある(/etc/ssh/sshd_configのSubsystem 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 を選ぶ理由も参考になる。
関連コマンド
参考
- manページ: man7.org sftp(1)
- OpenSSH: https://www.openssh.com/

コメント