sftp 是什么
sftp 是 OpenSSH 套件自带的交互式文件传输客户端,全部流量都走 SSH 加密通道,所以不存在明文 FTP 那种口令与内容暴露问题。进入会话后 put、get、ls、cd、mkdir、rm 的用法贴近本地 shell,适合「先看看目录再决定传什么」的多次操作;配合 -b 指定命令文件又能变成完全非交互的批量传输,是脚本化场景里替代 FTP 的首选。它与 scp 的差别在于交互能力,与 rsync 的差别在于 rsync 只传差异。
基本信息
| 适用平台 | Linux、macOS、Windows 10 及以上(系统自带 OpenSSH 客户端) |
|---|---|
| 语法 | sftp [user@]host 或 sftp -b 命令文件 host |
| 常用选项 | -P 指定端口 -b 批处理文件 -r 递归 -i 指定私钥 |
| 会话内命令 | ls cd lcd put get mkdir rm bye |
| 与 scp 对比 | scp 一次搬文件,sftp 适合浏览与多次操作 |
| 与 rsync 对比 | rsync 只传差异,sftp 每个文件都要一次往返 |
典型使用场景
- 登录服务器浏览目录再挑选文件下载,比写一条完整 scp 路径更灵活。
- 把一串 put/get 写进命令文件,做成可重复执行的传输脚本。
- 在只开放 SSH 的环境里替代 FTP 上传发布产物。
- 传输前先把远端旧文件改名备份,再上传新版本。
- 用递归下载一次取回一个日志目录(文件数量不多时够用)。
常用写法
常用写法
sftp ops@10.0.0.5 # 进入交互会话
# 会话内:ls | cd /data | put app.tar.gz | get app.log | mkdir logs | rm old.tgz | bye
sftp -P 2222 ops@10.0.0.5 # 指定非默认端口
sftp -i ~/.ssh/id_ed25519 ops@10.0.0.5 # 指定私钥免密登录
printf 'cd /data\nput backup.tar.gz\nbye\n' > cmd.txt
sftp -b cmd.txt ops@10.0.0.5 # 按命令文件批量执行
sftp -b cmd.txt -o BatchMode=yes ops@10.0.0.5 # 禁止交互提示,适合自动化
ls -l backup.tar.gz && sftp ops@10.0.0.5:/data/backup.tar.gz . # 传完核对选项与命令对照
| 选项或命令 | 作用 | 使用要点 |
|---|---|---|
| -P 端口 | 指定 SSH 端口 | sftp 用大写 P,别和 ssh 的小写 p 混用 |
| -b 文件 | 非交互批处理 | 命令文件里不能有交互动作,遇错默认继续 |
| -r | 递归传输 | 目录级操作,文件多时不如打包或 rsync |
| -i | 指定私钥 | 自动化免密登录必备 |
| -o BatchMode=yes | 禁用交互提示 | 避免脚本卡在口令或确认提示上 |
| bye / exit | 退出会话 | 批处理文件末尾要写上 |
批处理模式下某条命令失败默认继续执行后续命令,不会整体中断。需要在失败时停止可以用命令前的短横线前缀做细粒度控制,具体语义以本机 man 1 sftp 为准。
sftp 每个文件都要一次协议往返:传输成千上万个小文件时速度远不如 rsync,工程上通常先 tar 打包成一个文件再传,落地后解包。
批处理文件里的远端路径含空格需要用引号包起来,否则会被拆成多个参数并报文件不存在;含通配符的路径也要注意 sftp 的通配规则与本地 shell 不同。