全面地整理 Ubuntu 系统中远程传输 / 接收文件的指令集,包括更多实用参数、进阶用法、场景适配、故障排查以及不同工具的对比,方便你在不同场景下灵活选择和使用。
前置核心知识(必看)
远程文件传输的基础是 SSH 协议(默认端口 22),先明确 3 个关键前提:
-
路径规范 :
- 绝对路径:
/home/user/test.txt(推荐,避免路径混乱); - 相对路径:
./test.txt(以当前终端所在目录为基准);
- 绝对路径:
-
权限要求 :传输者需对「源路径有读权限」、对「目标路径有写权限」(否则会报
Permission denied); -
免密登录配置(推荐) :频繁传输时,配置 SSH 密钥可避免重复输入密码,步骤如下:
bash
运行
# 1. 本地生成SSH密钥(一路回车,无需设置密码) ssh-keygen -t rsa -b 4096 # 2. 将公钥上传到远程服务器(替换为你的远程信息) ssh-copy-id -p 22 远程用户名@远程IP # 示例:ssh-copy-id root@192.168.1.100
一、SCP(Secure Copy):极简单次传输
scp 是最基础的远程拷贝工具,基于 SSH 加密,无需额外安装,适合「一次性、小文件 / 目录」传输,优势是语法极简、无依赖。
1. 核心语法(通用)
bash
运行
scp [参数] 源地址 目标地址
# 地址格式:[用户名@]IP/主机名:文件/目录路径(本地地址无需加IP)
2. 完整参数说明(按常用度排序)
表格
| 参数 | 作用 | 示例 |
|---|---|---|
-r |
递归传输目录(必加,否则无法传文件夹) | scp -r 本地目录 root@IP:/远程路径 |
-P |
指定 SSH 端口(大写 P!小写 p 是保留属性) | scp -P 2222 test.txt root@IP:/home/ |
-p |
保留文件的修改时间、访问时间、权限(如 755、644) | scp -p test.txt root@IP:/home/ |
-q |
静默模式,不显示传输进度(适合脚本中使用) | scp -q test.txt root@IP:/home/ |
-C |
启用压缩传输(减少网络流量,适合大文件 / 慢网络) | scp -C test.zip root@IP:/home/ |
-l |
限制带宽(单位:Kbps,避免占满带宽) | scp -l 1024 test.iso root@IP:/home/(限制 1MB/s) |
-v |
详细输出(排错用,显示连接、传输细节) | scp -v test.txt root@IP:/home/ |
3. 全场景示例
(1)本地 → 远程(上传)
bash
运行
# 上传单个文件(绝对路径)
scp -C /home/user/test.txt root@192.168.1.100:/data/
# 上传单个文件(相对路径,当前终端在/home/user/)
scp test.txt root@192.168.1.100:/data/
# 上传目录(必加-r)+ 保留属性 + 指定端口
scp -r -p -P 2222 /home/user/testdir root@192.168.1.100:/data/
# 批量上传同类型文件(用通配符*)
scp -C /home/user/*.log root@192.168.1.100:/var/log/
(2)远程 → 本地(下载)
bash
运行
# 下载单个文件
scp -C root@192.168.1.100:/data/test.txt /home/user/
# 下载目录 + 限制带宽(避免拖慢服务器)
scp -r -l 2048 root@192.168.1.100:/data/testdir /home/user/
# 下载远程服务器上的多个文件(通配符)
scp root@192.168.1.100:/data/*.csv /home/user/csv_files/
(3)进阶:远程 A → 远程 B(本地中转)
无需先下载到本地,直接从远程服务器 A 传输到远程服务器 B(本地仅作为中转):
bash
运行
scp root@192.168.1.100:/data/test.txt root@192.168.1.101:/data/
4. SCP 常见问题 & 解决
表格
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
Connection refused |
远程 SSH 端口未开 / 端口写错 | 1. 检查远程 SSH 服务:ssh -p 端口 用户名@IP;2. 确认端口号(默认 22) |
Permission denied |
目标路径无写权限 / 源路径无读权限 | 1. 切换有权限的用户(如 root);2. 修改目标目录权限:chmod 777 /目标路径(临时测试) |
No such file or directory |
路径写错 / 文件不存在 | 1. 用ls 路径验证本地 / 远程路径;2. 优先用绝对路径 |
二、rsync:高效增量同步(推荐生产环境)
rsync 是进阶版传输工具,核心优势是「增量同步」(只传输文件变化的部分),适合「大文件、频繁同步、批量文件」场景,效率远高于 scp。
1. 前置安装(Ubuntu 默认可能未装)
bash
运行
sudo apt update && sudo apt install rsync -y
# 验证安装:rsync --version
2. 核心语法
bash
运行
rsync [参数] 源路径 目标路径
# 远程路径格式:用户名@IP:路径(和scp一致)
3. 核心参数(组合使用更高效)
表格
| 参数组合 | 作用 | 适用场景 |
|---|---|---|
-avz |
-a(归档模式:保留权限 / 时间 / 软链接)+ -v(详细输出)+ -z(压缩传输) |
绝大多数同步场景(首选) |
-avzP |
加 -P(显示传输进度 + 断点续传) |
大文件传输(如 ISO、视频) |
-avz --delete |
加 --delete(删除目标端多余文件) |
完全同步(如备份) |
-avz --exclude="*.log" |
过滤指定文件 / 目录 | 只传输需要的文件 |
4. 全场景示例
(1)本地 → 远程(上传 / 同步)
bash
运行
# 基础同步(保留属性+压缩+进度)
rsync -avzP /home/user/test.iso root@192.168.1.100:/data/
# 完全同步(目标和源一致,删除目标多余文件)
rsync -avz --delete /home/user/testdir root@192.168.1.100:/data/
# 过滤同步(排除.log文件,只传.txt)
rsync -avz --exclude="*.log" --include="*.txt" /home/user/testdir root@192.168.1.100:/data/
# 测试同步(dry-run,只看执行结果不实际传输)
rsync -avz --dry-run /home/user/testdir root@192.168.1.100:/data/
(2)远程 → 本地(下载 / 同步)
bash
运行
# 下载并同步目录(断点续传)
rsync -avzP root@192.168.1.100:/data/testdir /home/user/
# 增量同步(只传变化的文件,适合定期备份)
rsync -avz root@192.168.1.100:/data/ /home/user/backup/
(3)进阶:远程 A → 远程 B(无本地中转)
直接从远程 A 同步到远程 B(无需本地作为中转,效率更高):
bash
运行
rsync -avz root@192.168.1.100:/data/test.txt root@192.168.1.101:/data/
5. rsync 核心优势对比 scp
表格
| 场景 | scp | rsync |
|---|---|---|
| 小文件单次传输 | ✅ 简单 | ❌ 略繁琐 |
| 大文件 / 重复传输 | ❌ 重新传全部 | ✅ 只传变化部分 |
| 批量文件过滤 | ❌ 仅通配符 | ✅ 精细过滤(--exclude/--include) |
| 断点续传 | ❌ 不支持 | ✅ 支持(-P 参数) |
三、SFTP:交互式可视化传输
sftp 是交互式文件传输工具(基于 SSH),适合「需要先浏览远程目录、再选择文件传输」的场景(类似图形化 FTP 客户端),操作更直观。
1. 连接远程服务器
bash
运行
# 基础连接(默认端口22)
sftp 用户名@远程IP
# 指定端口
sftp -P 2222 用户名@远程IP
# 免密连接(已配置SSH密钥)
sftp root@192.168.1.100
2. 交互式核心指令(按功能分类)
连接成功后,终端会进入 sftp> 交互模式,以下是高频指令:
(1)目录 / 文件浏览
表格
| 指令 | 作用 | 示例 |
|---|---|---|
ls |
查看远程当前目录文件 | ls |
lls |
查看本地当前目录文件 | lls |
cd 路径 |
切换远程目录 | cd /data/ |
lcd 路径 |
切换本地目录 | lcd /home/user/ |
pwd |
查看远程当前目录路径 | pwd |
lpwd |
查看本地当前目录路径 | lpwd |
(2)文件 / 目录传输
表格
| 指令 | 作用 | 示例 |
|---|---|---|
get 远程文件 |
下载单个文件到本地 | get /data/test.txt |
get -r 远程目录 |
下载整个目录到本地 | get -r /data/testdir |
get -P 远程文件 |
断点续传下载 | get -P /data/test.iso |
put 本地文件 |
上传单个文件到远程 | put /home/user/test.txt |
put -r 本地目录 |
上传整个目录到远程 | put -r /home/user/testdir |
mget *.log |
批量下载匹配文件 | mget /data/*.log |
mput *.txt |
批量上传匹配文件 | mput /home/user/*.txt |
(3)文件管理(远程)
表格
| 指令 | 作用 | 示例 |
|---|---|---|
mkdir 目录名 |
远程创建目录 | mkdir /data/newdir |
rm 文件名 |
删除远程文件 | rm /data/test.txt |
rmdir 目录名 |
删除远程空目录 | rmdir /data/empty_dir |
rename 旧名 新名 |
远程重命名 | rename /data/old.txt /data/new.txt |
chmod 权限 文件名 |
修改远程文件权限 | chmod 755 /data/test.sh |
(4)退出 / 辅助
表格
| 指令 | 作用 |
|---|---|
exit/quit |
退出 sftp 交互模式 |
help |
查看所有 sftp 指令 |
!命令 |
执行本地命令(如!ls查看本地文件) |
3. SFTP 实操示例(完整流程)
bash
运行
# 1. 连接远程服务器
sftp root@192.168.1.100
# 2. 查看远程当前目录
sftp> ls
# 3. 切换远程目录到/data
sftp> cd /data
# 4. 切换本地目录到/home/user/download
sftp> lcd /home/user/download
# 5. 下载远程/data/test.iso(断点续传)
sftp> get -P test.iso
# 6. 上传本地/home/user/download/test.txt到远程/data
sftp> put test.txt
# 7. 远程创建新目录
sftp> mkdir newdir
# 8. 退出
sftp> exit
四、补充工具:特殊场景适配
1. wget/curl:直接下载远程服务器 / 网址文件
适合「无需登录 SSH,直接从远程服务器 / HTTP/HTTPS/FTP 地址下载文件」的场景:
bash
运行
# wget(推荐,断点续传+后台下载)
# 从远程SSH服务器下载(需开启SSH,本质是scp变种)
wget scp://root@192.168.1.100:/data/test.txt -O /home/user/test.txt
# 从HTTP地址下载(断点续传+后台)
wget -c -b https://example.com/test.zip -O /home/user/test.zip
# curl(适合简单下载/上传)
# 下载文件
curl -o /home/user/test.txt scp://root@192.168.1.100:/data/test.txt
# 上传文件(较少用,不如scp/rsync)
curl -T /home/user/test.txt scp://root@192.168.1.100:/data/
2. lftp:多线程 / 断点续传(适合慢网络)
适合「大文件、慢网络、需要多线程下载」的场景,支持 FTP/SFTP/HTTP:
bash
运行
# 安装
sudo apt install lftp -y
# 连接SFTP并多线程下载
lftp -u 用户名,密码 sftp://远程IP:22
lftp> set net:max-retries 5 # 设置重试次数
lftp> set pget:default-n 5 # 设置5线程下载
lftp> pget /data/test.iso # 多线程下载
lftp> exit
五、常见故障排查(通用)
表格
| 核心报错 | 根因 | 解决方案 |
|---|---|---|
Host key verification failed |
远程服务器 SSH 密钥变更 / 首次连接未确认 | 1. 删除本地缓存:rm ~/.ssh/known_hosts;2. 重新连接并输入yes确认 |
Timeout connecting to [IP] |
网络不通 / 远程防火墙拦截 / SSH 服务未启动 | 1. ping 远程 IP:ping 192.168.1.100;2. 检查远程防火墙:ufw allow 22;3. 重启 SSH:systemctl restart sshd |
scp: error: unexpected filename: ... |
路径包含空格 / 特殊字符 | 用引号包裹路径:scp "root@IP:/data/My File.txt" /home/user/ |
六、安全建议(重要)
-
禁用密码登录 :配置 SSH 密钥后,编辑
/etc/ssh/sshd_config,设置:bash
运行
PasswordAuthentication no ChallengeResponseAuthentication no重启 SSH:
systemctl restart sshd; -
修改默认端口:将 SSH 端口从 22 改为非默认(如 2222),减少暴力破解;
-
限制传输带宽 :用
scp -l/rsync --bwlimit避免占满服务器带宽; -
验证文件完整性 :传输大文件后,用
md5sum验证(本地和远程对比 MD5 值)。
总结
- 场景化选择工具 :
- 单次小文件 / 目录:用
scp(极简); - 大文件 / 频繁同步:用
rsync(增量 + 断点续传,生产环境首选); - 交互式浏览 + 传输:用
sftp(直观); - 远程网址下载:用
wget/curl。
- 单次小文件 / 目录:用
- 核心参数必记 :
- 传输目录加
-r;指定端口加-P(大写); - rsync 首选
-avzP(归档 + 压缩 + 进度 + 断点续传); - 免密登录配置
ssh-keygen + ssh-copy-id,提升效率和安全性。
- 传输目录加
- 故障排查核心:优先检查「路径、权限、SSH 服务 / 端口、网络」四大要素。