sftp
sftp是SSH文件传输协议(SSH File Transfer Protocol)的缩写,是由互联网工程任务组(IETF)设计的一种网络协议,在任意可靠数据流之上提供文件访问、文件传输和文件管理功能。它通常作为SSH-2的实现中的子系统运行,借助SSH的加密与认证机制保障传输安全,常被看作安全能力不足的传统FTP的替代方案。由于除传输文件外还能列目录、删除和重命名远程文件,它更接近一种远程文件系统协议。
定义
sftp是一种应用层网络协议,作用是在任何可靠数据流上完成文件访问、文件传输与文件管理[1]。它由互联网工程任务组(IETF)设计,定位为安全外壳协议(SSH)2.0 版本的扩展,用来提供安全的文件传输能力[1]。
协议本身并不实现加密与身份认证,而是假定自己运行在一条已经建立的安全信道之上,由下层协议完成服务器对客户端的认证,并把客户端用户身份交给上层使用[1]。名称上的相似容易引起误解:它并非把FTP放到SSH隧道里运行,而是由IETF的SECSH工作组另行设计的独立协议,与FTP没有继承关系;也曾被与早年的简单文件传输协议(Simple File Transfer Protocol)混为一谈[2][1]。
原理
一次会话通常从一条TCP连接开始,默认使用22端口,由客户端连到SSH服务器[3]。SSH完成版本协商、密钥交换与用户认证之后,客户端在SSH连接协议规定的通道(channel)上请求启动sftp子系统;SSH连接协议由RFC 4254定义,而该标准本身就预留了通过子系统提供文件传输类服务的方式[3]。子系统启动后,sftp在其上交换结构化的二进制报文,报文由命令码、请求标识与应答构成[4]。
sftp采用严格的请求—应答模式,服务器不会主动推送数据,只在回应客户端请求时发送内容[5]。传输一个文件时,客户端先发送打开文件请求,随后连续发送若干次按块读取或写入的请求,最后发送关闭文件请求,所有请求与应答都走同一条连接[5]。会话开始时客户端发送携带自身版本号的初始化报文,服务器回送版本报文,双方此后按协商确定的版本通信[6]。命令与数据共用同一连接,不需要像FTP那样另开数据端口,因此在穿越防火墙方面较为容易[4]。
发展历程
在IETF接手之前,sftp是SSH通信安全公司(SSH Communications Security)的专有协议,由塔图·于勒宁(Tatu Ylönen)在萨米·莱赫蒂宁(Sami Lehtinen)协助下于1997年设计[7]。早期版本0至2与后来的第3版之间差异,在该协议第2份草案的第10节中作了列举[7]。
负责SSH-2标准(即RFC 4251)的SECSH工作组随后尝试把安全文件传输也纳入草案,陆续发布多份互联网草案,推动协议版本迭代,其中第00、01、02号草案对应第3版[7]。软件业界在标准定稿之前就已各自实现不同版本。随着工作推进,该项目的范围从单纯传输扩展到文件访问与文件管理,部分成员认为这已使其变成文件系统协议、超出工作组职权,标准化进程因此停滞[7]。中断约7年之后,2013年曾有以第3版草案为基线重新推进的尝试[7]。
由于始终没有成为正式标准,实际部署中流行的是第3版:OpenSSH自2001年3月7日起实现这一版本,并仅按第1份草案实现第3版,更新的草案特性只以扩展的形式零星补充[8][7]。部分Windows平台上的实现则使用与Unix耦合更少的第4版[9]。
应用
sftp最常见的用途是在客户端与服务器之间上传、下载文件,典型场景包括向云服务器实例传文件、网站内容发布和运维脚本的批量分发[10]。与之配套的命令行客户端提供类似传统FTP的交互界面,支持列目录、切换目录、创建目录、删除与重命名远程文件,也提供put、get等上传下载命令和递归处理整个目录的选项[2][10]。
不少文件服务器软件也实现了sftp,可以同时支持较常见的第3版以及使用较少的第4、5、6版草案[4]。在多数部署中,sftp服务由SSH服务器一并提供,与其它SSH服务共用默认的22端口[1]。第3版还支持在会话中声明扩展命令,并通过版本协商把它们纳入,实现厂商可以在不改变基础协议的情况下增加功能[7]。
局限
协议把安全责任完全交给下层:自身不做认证,也不负责加密,若承载它的数据流本身不安全,传输内容不会得到保护[1]。与只做文件传输的SCP相比,sftp的请求—应答往复较多,在带宽充足时通常明显更慢,这也是两者长期并存的原因之一[1]。
开放性不足是另一个问题:sftp始终停留在互联网草案阶段,没有对应的RFC正式标准,第4版及以后各版本之间还存在互不兼容的改动,导致不同实现的兼容性参差不齐[4]。具体到续传能力,常见命令行客户端的断点续传只对单个文件生效,整目录传输中断后仍需重新传输或改用其它同步工具[10]。此外,sftp运行在SSH的子系统机制上,而SSH-1不支持子系统概念,因此连接到仅支持SSH-1的服务器时,客户端必须自行知道服务端可执行文件的路径,可移植性受到限制[1]。
参见
参考资料
- SSH File Transfer Protocol - Communication protocol [引用日期2026-10-29]
- sftp(1) [引用日期2026-10-29]
- What is SFTP - FileZilla Pro [引用日期2026-10-29]
- SSH/SFTP - Protocol Discussion [引用日期2026-10-29]
- view-source [引用日期2026-10-29]
- view-source [引用日期2026-10-29]
- SSH File Transfer Protocol: Difference between revisions [引用日期2026-10-29]
- SFTP specifications [引用日期2026-10-29]
- SSH_file_transfer_protocol [引用日期2026-10-29]
- 通过sftp/scp/rsync向Linux实例传输文件 - Alibaba Cloud [引用日期2026-10-29]