SFTP 是什么
SFTP 是跑在 SSH 连接里的文件传输子系统:先建立标准 SSH 会话(默认 22 端口),再在其中开启一条 sftp 通道传文件。它因此天然复用 SSH 的加密、认证与访问控制,能一次性完成上传下载、列目录、改名、改权限等操作。名字里虽有 FTP,但它与 FTP/FTPS 是两套完全不同的协议,只是缩写相似,别把端口和客户端填错。
基本信息
| 端口 | 22(随 SSH 端口,可自定义) |
|---|---|
| 承载 | SSH 通道上的 sftp 子系统 |
| 能力 | 上传下载、列目录、改名、改权限、创建目录、删除 |
| 认证 | SSH 密钥或口令,复用 sshd 配置 |
| 规范 | SSH 文件传输协议草案(draft-ietf-secsh-filexfer)与 RFC 4254 |
| 启用方式 | sshd_config 中的 Subsystem sftp 一行 |
典型使用场景
- 运维在服务器之间搬运部署包与日志,不需要额外开 FTP 服务
- 受限账号只用文件传输而不用登录 shell,典型做法是 chroot 到家目录
- 脚本批量化传输:用 -b 传入命令文件做无人值守上传
- 对接第三方数据交换:对方只开 22 端口给一个受限目录
- 临时排查:交互式进入确认目录内容与权限,再决定是否脚本化
命令行使用
命令行使用
# 交互式进入
sftp -P 22 user@host
sftp> ls / pwd / lls / lpwd # 远端与本地目录
sftp> get -r /data/report ./report # 递归下载
sftp> put local.tar.gz /upload/ # 上传
sftp> chmod 640 /upload/local.tar.gz
sftp> reget big.iso # 中断后续传(部分客户端支持)
# 批处理:把命令写进文件一次执行
sftp -b cmds.txt user@host
# 换私钥与端口
sftp -o IdentityFile=~/.ssh/id_ed25519 -P 2222 user@host与相邻方案对照
| 方案 | 承载 | 适用 |
|---|---|---|
| SFTP | SSH(22) | 加密传输 + 复用 SSH 认证与 chroot |
| FTPS | TLS(990/21) | FTP 加 TLS,与 SSH 无关 |
| SCP | SSH(22) | 一次性复制,不支持列目录与改名 |
| rsync over ssh | SSH(22) | 增量同步与断点续传,不做权限管理 |
| FTP | 明文(21) | 已不推荐用于公网传输 |
sshd_config 里的 Subsystem sftp 一行决定该服务是否可用;把账号通过 ChrootDirectory 加 internal-sftp 限制在家目录后,客户端只能看到被授权的目录树,适合只做文件交换的第三方账号。
传大目录时,SFTP 单文件效率不错,但海量小文件或需要差量同步时,rsync 走 SSH 通常更快;权限与所有权变更用 SFTP 的 chmod/chown 更直接。