SFTP (SSH File Transfer Protocol) 建立在 SSH 協定之上,加密傳輸、支援公開金鑰認證、無需額外開啟 FTP 埠口,是 Linux 伺服器間傳檔的標準選擇。本文涵蓋連線、互動指令、批次上傳/下載、非標準埠口、金鑰認證等實戰技巧。

sftp user@host
sftp -oPort=2222 user@host # 或 sftp -P 2222 user@host # OpenSSH 7.6+ 支援 -P 大寫
sftp user@host:/remote/path/file.txt /local/path/ # 下載 sftp /local/path/file.txt user@host:/remote/path/ # 上傳
進入 `sftp>` 提示字元後:
| 遠端操作 | 本地操作 (加 l 前綴) | 說明 |
|---|---|---|
| ls / lls | lls | 列出檔案 |
| cd / lcd | lcd | 切換目錄 |
| pwd / lpwd | lpwd | 顯示當前路徑 |
| mkdir / lmkdir | lmkdir | 建立目錄 |
| rm / lrm | lrm | 刪除檔案 |
| rmdir / lrmdir | lrmdir | 刪除空目錄 |
| chmod / lchmod | lchmod | 修改權限 |
| chown / lchown | lchown | 修改擁有者 |
| get remote [local] | - | 下載檔案/目錄 (-r 遞歸) |
| put local [remote] | - | 上傳檔案/目錄 (-r 遞歸) |
| help / ? | - | 查看所有指令 |
| bye / exit / quit | - | 離開 SFTP |
sftp> get test.cpp ./Project/
sftp> put /home/liu/Software/RHEL_5.5_x86_64.iso /home/xudong/Blog/
sftp> put -r /local/project /remote/backup/
# 檢查 sshd 狀態 systemctl status sshd # 若未啟動 systemctl start sshd systemctl enable sshd
確認 /etc/ssh/sshd_config 包含:
Subsystem sftp internal-sftp # 或 Subsystem sftp /usr/libexec/openssh/sftp-server
ssh-keygen -t ed25519ssh-copy-id user@hostbatch.txt:put -r /var/www/html /backup/web-$(date +%F) get -r /var/log/nginx /local/logs/nginx-$(date +%F) bye
sftp -b batch.txt user@host| 特性 | SFTP | FTP | FTPS |
|---|---|---|---|
| 加密 | 全程 SSH 加密 | 明文 | SSL/TLS 加密 |
| 埠口 | 22 (單一) | 21 + 被動模式隨機埠 | 990 + 被動模式隨機埠 |
| 防火牆友善 | 極佳 | 差 | 中 |
| 認證方式 | 密碼/金鑰/多因子 | 密碼 | 密碼/憑證 |
| 指令相容 | 類 FTP 子集 | 標準 RFC 959 | 同 FTP |
SFTP 以單一埠口、強加密、金鑰認證、原生支援批次腳本,成為 Linux 伺服器間檔案傳輸的**事實標準**。熟練 `get/put -r`、`lcd/lls` 本地遠端切換、批次檔 `-b` 參數,即可應付 99% 傳檔場景。