首页/网络/协议速查/SFTP(SSH 文件传输)

SFTP(SSH 文件传输)

跑在 SSH 会话里的文件传输子系统:一条 22 端口连接搞定传输、改名、权限;与 FTP 协议毫无关系。

协议速查网络更新于 2026-10-13

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

与相邻方案对照

方案承载适用
SFTPSSH(22)加密传输 + 复用 SSH 认证与 chroot
FTPSTLS(990/21)FTP 加 TLS,与 SSH 无关
SCPSSH(22)一次性复制,不支持列目录与改名
rsync over sshSSH(22)增量同步与断点续传,不做权限管理
FTP明文(21)已不推荐用于公网传输
sshd_config 里的 Subsystem sftp 一行决定该服务是否可用;把账号通过 ChrootDirectory 加 internal-sftp 限制在家目录后,客户端只能看到被授权的目录树,适合只做文件交换的第三方账号。
传大目录时,SFTP 单文件效率不错,但海量小文件或需要差量同步时,rsync 走 SSH 通常更快;权限与所有权变更用 SFTP 的 chmod/chown 更直接。

易错点

  • 把 SFTP 当成 FTPS:对方给的是 22 端口却填进 FTPS 客户端,必然连不上,两者只是名字像
  • chroot 目录没有按 sshd 要求设为 root 所有且不可写,导致登录被拒
  • 只用口令认证且开放公网 22,成为爆破目标,应改为密钥认证并限制来源
  • 递归传输海量小文件时用 SFTP 逐文件操作,效率远低于 rsync 差量同步
  • 上传后不校验大小或校验和,网络中断留下的半截文件被当作完整文件使用

数据来源与参考

  • SSH 文件传输协议(draft-ietf-secsh-filexfer)
  • RFC 4254(SSH 连接协议)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌