Linux命令-sftp(SSH 文件传输协议客户端)
-
- [🔰 简介](#🔰 简介)
- [📖 语法](#📖 语法)
- [⚙️ 选项](#⚙️ 选项)
- [💡 交互命令](#💡 交互命令)
- [💡 示例](#💡 示例)
-
- [示例 1:交互式基本操作](#示例 1:交互式基本操作)
- [示例 2:非交互模式------在 Shell 中执行单条 SFTP 命令](#示例 2:非交互模式——在 Shell 中执行单条 SFTP 命令)
- [示例 3:批量文件传输------使用批处理文件](#示例 3:批量文件传输——使用批处理文件)
- [示例 4:SSH 密钥认证与安全加密](#示例 4:SSH 密钥认证与安全加密)
- [示例 5:SFTP 运维实战------Web 站点部署](#示例 5:SFTP 运维实战——Web 站点部署)
- [示例 6:SFTP 断点续传与传输限制](#示例 6:SFTP 断点续传与传输限制)
- [⚠️ 注意](#⚠️ 注意)
- [📚 相关命令](#📚 相关命令)
- [📝 总结](#📝 总结)
快速参考 :sftp 是基于 SSH 的安全文件传输客户端,提供交互式命令行界面,支持上传、下载、目录浏览、权限管理等完整文件操作。所有数据通过 SSH 加密通道传输,是 FTP 的安全替代方案。
sftp与 FTPS (FTP over SSL/TLS) 是不同的协议。sftp 运行在 SSH 子系统中(默认端口 22),只需 SSH 服务即可,无需额外守护进程。
🔰 简介
SFTP(SSH File Transfer Protocol)是 SSH 协议族的一部分,由 IETF 在 draft-ietf-secsh-filexfer 系列草案中定义。与 SCP 不同,SFTP 是一个有状态的交互式协议,支持断点续传、目录列表、权限修改等高级操作,功能远超 SCP。
安装状态 :sftp 随 OpenSSH 客户端一同安装,几乎所有 Linux 发行版默认包含。
bash
# 检查 sftp 是否可用
$ which sftp
/usr/bin/sftp
# 如不存在(极少见),安装方式:
# Debian/Ubuntu
$ sudo apt-get install openssh-client
# RHEL/CentOS/Fedora
$ sudo yum install openssh-clients
📖 语法
bash
sftp [选项] [用户@]主机[:路径]
sftp [选项] [用户@]主机[:源文件] [目标路径]
sftp -b 批处理文件 [用户@]主机
第一种形式进入交互模式,第二种形式用于单次文件下载(类似 scp),第三种形式用于非交互的批量操作。
⚙️ 选项
| 选项 | 说明 |
|---|---|
-P 端口 |
指定 SSH 连接端口(注意大写 P,与 ssh 命令不同) |
-i 私钥文件 |
指定用于认证的 SSH 私钥 |
-b 批处理文件 |
从文件读取 SFTP 命令,非交互式执行 |
-o ssh_option |
传递额外 SSH 选项(如 -o StrictHostKeyChecking=no) |
-C |
启用 SSH 压缩传输 |
-c 加密算法 |
指定加密算法(如 aes256-gcm@openssh.com) |
-l 限制值 |
限制传输带宽(单位 KB/s) |
-r |
递归复制整个目录(交互模式下已废弃,使用 get -r) |
-v |
详细输出模式,便于调试连接问题 |
-q |
静默模式,不显示进度信息 |
💡 交互命令
进入 SFTP 后的交互命令体系,是 SFTP 最强大的部分:
远程操作命令
| 命令 | 说明 |
|---|---|
ls [目录] |
列出远程目录内容 |
cd 目录 |
切换远程工作目录 |
pwd |
显示远程当前目录 |
mkdir 目录 |
创建远程目录 |
rmdir 目录 |
删除远程空目录 |
rm 文件 |
删除远程文件 |
rename 旧名 新名 |
重命名远程文件 |
chmod 模式 文件 |
修改远程文件权限 |
chown 属主 文件 |
修改远程文件所有者(需权限) |
chgrp 组 文件 |
修改远程文件所属组 |
df [-h] |
显示远程文件系统磁盘使用情况 |
stat 文件 |
显示远程文件详细信息(类似于 ls -l 但更丰富) |
ln [-s] 源 目标 |
创建远程硬链接或符号链接 |
symlink 源 目标 |
创建远程符号链接 |
本地操作命令
| 命令 | 说明 |
|---|---|
lls [目录] |
列出本地目录内容 |
lcd 目录 |
切换本地工作目录 |
lpwd |
显示本地当前目录 |
lmkdir 目录 |
创建本地目录 |
!命令 |
在本地 Shell 中执行命令(例如 !ls -la) |
文件传输命令
| 命令 | 说明 |
|---|---|
get [-r] 远程文件 [本地路径] |
下载远程文件,-r 递归下载目录 |
put [-r] 本地文件 [远程路径] |
上传本地文件,-r 递归上传目录 |
mget 通配符 |
批量下载(支持 * ? 通配符) |
mput 通配符 |
批量上传 |
reget 远程文件 |
断点续传下载 |
reput 本地文件 |
断点续传上传 |
progress |
切换传输进度显示 |
控制命令
| 命令 | 说明 |
|---|---|
bye / exit / quit |
退出 SFTP 会话 |
help [命令] |
显示帮助信息 |
version |
显示 SFTP 协议版本 |
💡 示例
示例 1:交互式基本操作
bash
$ sftp alice@192.168.1.100
Connected to 192.168.1.100.
sftp> pwd
Remote working directory: /home/alice
sftp> lpwd
Local working directory: /home/bob/projects
sftp> ls -la
drwxr-xr-x 6 alice alice 4096 Jun 14 10:00 .
drwxr-xr-x 4 root root 4096 Jun 10 08:00 ..
-rw-r--r-- 1 alice alice 220 Jun 14 09:30 .bash_logout
-rw-r--r-- 1 alice alice 3771 Jun 14 09:30 .bashrc
drwxr-xr-x 2 alice alice 4096 Jun 14 10:00 documents
sftp> cd documents
sftp> put report.txt
Uploading report.txt to /home/alice/documents/report.txt
report.txt 100% 2048 2.0KB/s 00:00
sftp> get logfile.txt
Fetching /home/alice/documents/logfile.txt to logfile.txt
logfile.txt 100% 4096 4.0KB/s 00:00
sftp> lls
logfile.txt report.txt notes.md
sftp> rm old_backup.tar.gz
Removing /home/alice/documents/old_backup.tar.gz
sftp> bye
# 预期输出:
# 成功连接 → 浏览目录 → 上传 report.txt → 下载 logfile.txt → 删除旧备份 → 退出
示例 2:非交互模式------在 Shell 中执行单条 SFTP 命令
bash
# 直接下载单个文件(类似 scp 用法)
$ sftp bob@fileserver:/var/log/nginx/access.log ./my_access.log
Fetching /var/log/nginx/access.log to ./my_access.log
/var/log/nginx/access.log 100% 125MB 12.5MB/s 00:10
# 上传文件
$ sftp bob@fileserver:./deploy.tar.gz /tmp/
(注意:此用法上传时第一个参数是本地文件,第二个是远程目标)
# 使用 Here Document 执行多条命令
$ sftp deploy@sftp.example.com << 'EOF'
cd /var/www/html
put index.html
put style.css
put app.js
ls -la
bye
EOF
# 预期输出:
# sftp> cd /var/www/html
# sftp> put index.html(进度条)
# sftp> put style.css(进度条)
# sftp> put app.js(进度条)
# sftp> ls -la
# drwxr-xr-x ... index.html
# -rw-r--r-- ... style.css
# -rw-r--r-- ... app.js
# sftp> bye
示例 3:批量文件传输------使用批处理文件
bash
# Step 1: 创建批处理命令文件
$ cat > batch_download.sftp << 'CMDS'
cd /backup/database
lcd /local/restore
get db_dump_20260614.sql.gz
get innodb_backup.tar.gz
cd /backup/logs
lcd /local/restore/logs
mget *.log
rm *.log.old
bye
CMDS
# Step 2: 执行批处理传输
$ sftp -b batch_download.sftp admin@dbserver
sftp> cd /backup/database
sftp> lcd /local/restore
sftp> get db_dump_20260614.sql.gz
Fetching /backup/database/db_dump_20260614.sql.gz to /local/restore/db_dump_20260614.sql.gz
sftp> get innodb_backup.tar.gz
Fetching /backup/database/innodb_backup.tar.gz to /local/restore/innodb_backup.tar.gz
sftp> cd /backup/logs
sftp> lcd /local/restore/logs
sftp> mget *.log
Fetching /backup/logs/error.log to /local/restore/logs/error.log
Fetching /backup/logs/access.log to /local/restore/logs/access.log
sftp> rm *.log.old
Removing /backup/logs/error.log.old
Removing /backup/logs/access.log.old
# 批处理文件的通用格式:
# - 每行一条 SFTP 交互命令
# - 支持所有 sftp 交互命令(ls/cd/get/put/rm 等)
# - 最后以 bye/exit/quit 结束
# 在 cron 定时任务中使用批处理
$ crontab -e
# 每天凌晨 3 点自动下载数据库备份
0 3 * * * sftp -b /scripts/batch_download.sftp -o StrictHostKeyChecking=no admin@dbserver >> /var/log/sftp_cron.log 2>&1
示例 4:SSH 密钥认证与安全加密
bash
# Step 1: 生成专用 SFTP 密钥对
$ ssh-keygen -t ed25519 -f ~/.ssh/sftp_key -C "sftp@myhost"
Generating public/private ed25519 key pair.
Your identification has been saved in /home/user/.ssh/sftp_key
Your public key has been saved in /home/user/.ssh/sftp_key.pub
# Step 2: 将公钥部署到远程服务器
$ ssh-copy-id -i ~/.ssh/sftp_key.pub user@sftp-server
# 或者手动部署(无 ssh-copy-id 时)
$ cat ~/.ssh/sftp_key.pub | ssh user@sftp-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Step 3: 指定私钥连接
$ sftp -i ~/.ssh/sftp_key user@sftp-server
Connected to sftp-server.
sftp> ls
(无需输入密码,直接进入交互模式)
# Step 4: SSH 配置文件简化
$ cat >> ~/.ssh/config << 'CONFIG'
Host sftp-prod
HostName sftp.corp.example.com
Port 2222
User deploy
IdentityFile ~/.ssh/sftp_key
StrictHostKeyChecking yes
CONFIG
# 现在可以用别名连接
$ sftp sftp-prod
Connected to sftp.corp.example.com.
sftp>
# 预期效果:一键连接,无需记忆 IP/端口/用户名/密钥路径
示例 5:SFTP 运维实战------Web 站点部署
bash
#!/bin/bash
# Web 站点通过 SFTP 部署脚本
SFTP_HOST="web-prod"
REMOTE_ROOT="/var/www/html/mysite"
# 本地构建目录
BUILD_DIR="./dist"
echo "=== 开始部署到 $SFTP_HOST ==="
# 清理远程旧文件
echo "清理远程旧文件..."
sftp -b - "$SFTP_HOST" << 'SFTPEOF'
cd /var/www/html/mysite
rm -rf css js images
rm index.html
SFTPEOF
# 上传新构建文件
echo "上传构建产物..."
cd "$BUILD_DIR"
# 递归上传目录
sftp -b - "$SFTP_HOST" << SFTPEOF
cd $REMOTE_ROOT
put -r css
put -r js
put -r images
put index.html
put favicon.ico
chmod 644 *.html *.ico
chmod 755 css js images
bye
SFTPEOF
echo "=== 部署完成 ==="
# 验证部署
sftp "$SFTP_HOST" << 'SFTPEOF'
cd /var/www/html/mysite
ls -la
df -h
bye
SFTPEOF
# 预期输出:
# === 开始部署到 web-prod ===
# 清理远程旧文件...
# 上传构建产物...
# === 部署完成 ===
# sftp> ls -la
# drwxr-xr-x ... css
# drwxr-xr-x ... js
# drwxr-xr-x ... images
# -rw-r--r-- ... index.html
# sftp> df -h
# Size Used Avail (root) /dev/vda1 50.0G 12.5G 37.5G /
示例 6:SFTP 断点续传与传输限制
bash
# 断点续传下载(reget = resume + get)
sftp user@host
sftp> reget large_video.mp4
Resuming /remote/path/large_video.mp4 to large_video.mp4
large_video.mp4 50% 500MB 10.2MB/s 00:25 ETA
# 如果中途断开,重新连接后:
sftp user@host
sftp> reget large_video.mp4
Resuming large_video.mp4 at byte 524288000
large_video.mp4 100% 1000MB 10.0MB/s 01:38
# 限制传输带宽(-l 参数,单位 KB/s)
$ sftp -l 1024 user@host # 限制为 1MB/s(1024 KB/s)
sftp> get huge_database.dump
huge_database.dump 30% 300MB 1024KB/s 05:00 ETA
# 带宽被限制在 1MB/s,避免占满网络
# 启用压缩传输(-C 参数,对文本文件效果明显)
$ sftp -C user@host
sftp> put large_log.txt
# 压缩传输可显著减少文本数据的传输量
⚠️ 注意
SFTP vs SCP 的选择建议:虽然两者都基于 SSH,但适用场景不同:
| 特性 | SFTP | SCP |
|---|---|---|
| 协议类型 | 有状态交互式 | 无状态一次性传输 |
| 断点续传 | ✅ 支持 reget |
❌ 不支持 |
| 目录列表 | ✅ ls / dir |
❌ 不支持 |
| 远程文件管理 | ✅ 完整的 rm/mkdir/chmod |
❌ 不支持 |
| 传输速度 | 略慢(协议开销稍大) | 略快(开销小) |
| 适用场景 | 交互操作、批量管理 | 简单一次性传输 |
常见连接问题排查:
- 连接超时 :检查 SSH 端口是否正确(
-P而非-p),防火墙是否放行- 权限拒绝 :确认密钥权限为 600(
chmod 600 ~/.ssh/id_*)- 找不到 sftp 子系统 :检查远程
/etc/ssh/sshd_config中Subsystem sftp是否配置
📚 相关命令
| 命令 | 说明 |
|---|---|
scp |
基于 SSH 的简单文件复制工具 |
rsync |
高级文件同步工具,支持增量传输和丰富选项 |
ssh |
SSH 客户端,sftp 运行在其协议之上 |
sshfs |
通过 SSH 挂载远程文件系统到本地 |
lftp |
多协议文件传输客户端,支持 sftp/ftp/http 等 |
curl |
支持 SFTP 协议(sftp:// URL),用于脚本集成 |
📝 总结
sftp 是 Linux 系统管理员和开发者的日常必备工具,它完美结合了 SSH 的安全性和 FTP 的交互便利性。核心优势:
- 安全性:全数据通过 SSH 加密传输,无明文风险
- 免部署:只需 SSH 服务即可,无需额外安装 FTP 守护进程
- 交互性:支持完整的远程文件管理操作(浏览、增删改、权限管理)
- 可脚本化:批处理模式和 Here Document 支持自动化运维
- 断点续传:大文件传输中断后可恢复,节省时间和带宽
日常文件传输首选 SFTP,仅在需要增量同步/镜像备份时使用 rsync,仅在极简一次性传输时使用 scp。