一、前置核心:SSH 免密登录原理(所有工具底层都依赖它)
1. 免密原理
- 客户端生成非对称密钥对 :私钥(本地保管,绝不外传)、公钥(
.pub,发给目标机器) - 目标机器把客户端公钥写入
~/.ssh/authorized_keys - 客户端 SSH 连接时自动用私钥签名,服务端匹配公钥,无需输入密码登录
2. 一键免密配置完整步骤(通用所有传输工具)
步骤 1:客户端生成密钥(一路回车,不设密钥密码最方便免密)
# rsa算法(通用兼容所有老机器)
ssh-keygen -t rsa
# 新安全算法ed25519(推荐,现代系统优先)
ssh-keygen -t ed25519
生成路径默认:~/.ssh/id_ed25519(私钥)、~/.ssh/id_ed25519.pub(公钥)
步骤 2:推送公钥到目标服务器(两种方式)
方式 A:ssh-copy-id(最简单,推荐)
# 格式 ssh-copy-id 用户名@目标IP
ssh-copy-id root@192.168.10.20
# 指定端口(对方ssh不是22端口)
ssh-copy-id -p 2222 root@192.168.10.20
自动创建.ssh目录、授权文件、修正权限。
方式 B:手动推送(无 ssh-copy-id 工具时用)
# 把公钥追加到对方授权文件
cat ~/.ssh/id_ed25519.pub | ssh root@192.168.10.20 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
步骤 3:关键权限(权限错误免密直接失效)
客户端本地权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
目标服务器权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
步骤 4:测试免密登录
ssh root@192.168.10.20
# 自定义端口
ssh -p2222 root@192.168.10.20
无需输密码即配置成功,rsync/scp/sftp/sshfs 全部自动复用这套免密。
3. 进阶:密钥带密码(安全场景)
生成密钥时设置密码,免密传输会要求输密钥密码,可搭配 ssh-agent 缓存私钥密码:
# 启动代理
eval $(ssh-agent)
# 加载私钥,输入一次密码全程生效
ssh-add ~/.ssh/id_ed25519
二、四大远程文件传输工具对比总览
| 工具 | 底层协议 | 核心优势 | 短板 | 适用场景 |
|---|---|---|---|---|
| scp | ssh | 语法简单、系统默认自带、小文件快速复制 | 全量传输、无增量、不校验文件属性、大文件慢 | 少量小文件一次性传输、临时拷贝 |
| rsync | ssh (rsync 协议) | 增量同步、断点续传、校验文件、保留权限软硬链接、压缩传输 | 参数较多,初次上手复杂 | 大目录、定时备份、服务器同步、增量更新 |
| sftp | ssh | 交互式操作、支持浏览目录、删除重命名、类 ftp 操作 | 脚本批量同步不如 rsync 高效 | 手动交互式管理远程文件 |
| sshfs | ssh | 把远程服务器目录挂载成本地磁盘 | 网络中断挂载失效,不适合超大文件备份 | 临时读写远程目录,像操作本地文件夹 |
三、scp 完整详解(SSH 免密直接生效)
语法格式
# 本地 → 远程
scp [参数] 本地文件/目录 用户名@IP:远程路径
# 远程 → 本地
scp [参数] 用户名@IP:远程文件/目录 本地路径
# 远程A → 远程B(中转传输)
scp root@10.0.0.1:/tmp/a.txt root@10.0.0.2:/tmp/
常用核心参数
| 参数 | 作用 |
|---|---|
| -r | 递归传输目录(文件夹必加) |
| -P | 指定 SSH 端口(大写 P,区别 ssh 小写 p) |
| -C | 传输过程开启压缩,节省带宽 |
| -p | 保留文件修改时间、权限 |
| -q | 静默输出,不打印过程 |
实操示例(免密环境直接运行)
# 1. 推送单个文件到远程
scp /data/test.txt root@192.168.10.20:/opt/
# 2. 拉取远程文件到本地
scp root@192.168.10.20:/opt/log.tar.gz /data/
# 3. 传输文件夹(-r)自定义ssh端口2222
scp -r -P 2222 /data/www root@192.168.10.20:/home/
# 4. 压缩静默传输目录
scp -rCq /data/backup root@192.168.10.20:/mnt/
scp 致命缺点(不适合备份场景)
- 每次传输完整拷贝所有文件,不对比差异,修改少量文件也要重传全部
- 无断点续传,网络中断需要从头传输
- 无法过滤排除指定文件 / 目录
四、rsync 重点详解(生产首选,SSH 免密模式)
rsync 默认两种传输模式:
- ssh 模式(日常 99% 使用,复用 ssh 免密) :
rsync 文件 user@ip:路径 - rsync daemon 模式(独立端口,企业大规模集群同步用,文末补充)
基础语法(ssh 免密传输)
# 本地推送至远程
rsync [参数] 本地路径 user@目标IP:远程目录
# 远程拉取到本地
rsync [参数] user@目标IP:远程目录 本地路径
必记核心参数(生产标准组合 -avz)
-a归档模式(最关键):等价-rlptgoD- r 递归目录;l 保留软链接;p 保留权限;t 保留修改时间;g/o 保留属组属主;D 保留设备文件
-vverbose 打印详细传输日志,脚本排错必备-z传输时压缩,跨机房低带宽必开-P=--progress --partial:显示传输进度 + 断点续传(超大文件神器)--delete危险参数:删除目标端存在、本地不存在的文件(做镜像备份用)--exclude='xxx'排除文件 / 目录,支持通配符--port=2222指定 ssh 端口--bwlimit=10000限速,单位 KB/s,避免占满带宽
高频实操示例(免密直接执行)
# 1. 标准推送本地目录到远程(增量、压缩、进度、保留属性)
rsync -avzP /data/www root@192.168.10.20:/opt/www/
# 2. 拉取远程日志目录到本地,限速5MB/s
rsync -avzP --bwlimit=5120 root@192.168.10.20:/var/log/ /local/log_backup/
# 3. 排除缓存、日志目录同步
rsync -avzP --exclude='tmp' --exclude='*.log' /data root@192.168.10.20:/mnt/
# 4. 镜像同步(目标和本地完全一致,多余文件删除)
rsync -avzP --delete /data root@192.168.10.20:/mnt/data/
# 5. SSH非22端口同步
rsync -avzP --port=2222 /backup root@192.168.10.20:/data/
rsync 优势总结
- 增量传输:只发送文件差异部分,重复同步速度极快
- 断点续传,网络断了不用重传整个文件
- 完整保留 Linux 文件权限、属主、软硬链接、时间戳
- 支持过滤、限速、删除冗余文件,完美适配定时备份脚本
- 可配合 crontab 做定时自动同步(免密是前提)
五、sftp 交互式文件传输(SSH 免密可用)
底层同样 SSH 协议,免密登录后无需密码,适合手动浏览操作。
1. 交互式登录
# 默认22端口
sftp root@192.168.10.20
# 自定义端口
sftp -oPort=2222 root@192.168.10.20
登录后常用交互命令:
ls、lls # 远程目录 / 本地目录
cd、lcd # 切换远程目录 / 本地目录
get 远程文件 # 下载到本地
put 本地文件 # 上传到远程
mkdir/rm/rmdir # 创建、删除文件目录
exit # 退出
2. 非交互脚本批量传输(适合简单自动化)
# 脚本上传单个文件
sftp -oPort=22 root@192.168.10.20 << EOF
put /data/test.txt /opt/
EOF
# 批量下载
sftp root@192.168.10.20 << EOF
get /opt/*.log /local/log/
EOF
缺点:不支持增量,大批量同步性能远不如 rsync。
六、sshfs 远程目录本地挂载(免密读写)
把远程服务器文件夹挂载成本地磁盘,操作如同本地文件,底层 ssh。
1. 安装工具
# CentOS/RHEL
yum install sshfs -y
# Debian/Ubuntu
apt install sshfs -y
2. 挂载 & 卸载(免密直接生效)
# 创建本地挂载点
mkdir /mnt/remote_data
# 挂载远程目录
sshfs root@192.168.10.20:/data /mnt/remote_data -o port=2222
# 卸载
fusermount -u /mnt/remote_data
适用场景:临时查看、编辑远程少量文件;不适合大批量同步备份。
七、补充:rsync daemon 模式(无 ssh,独立 873 端口)
适用于大规模内网集群同步,不用 ssh 免密,单独配置 rsync 账号,简单介绍:
-
服务端配置
/etc/rsyncd.conf定义共享模块、权限、白名单 -
服务端启动
rsync --daemon -
客户端同步语法(无 @,用双冒号)
rsync -avz /data rsync://192.168.10.20/backup/
简写
rsync -avz /data 192.168.10.20::backup/
个人 / 中小型服务器同步优先用 ssh 免密 rsync,无需额外开放端口,安全简单。
八、生产使用选型总结(直接照着选)
- 定时备份、服务器文件同步、大目录增量更新 → rsync -avzP(ssh 免密)
- 临时拷贝少量小文件、一次性传输 → scp
- 手动登录浏览、交互式上传下载文件 → sftp
- 需要直接读写远程目录,像本地文件夹操作 → sshfs
九、常见排错(免密失效 / 传输报错)
- 仍提示输密码:检查
.ssh目录、私钥、authorized_keys 权限必须 700/600 - SSH 自定义端口同步失败:scp 用
-P,rsync 用--port,sftp 用-oPort - rsync 同步丢失权限:必须加
-a参数 - 传输慢:添加
-z压缩,配合--bwlimit合理限速 - 目标文件删不掉:
--delete参数慎用,先去掉测试同步差异
十、自动化示例:crontab 定时免密 rsync 备份脚本
#!/bin/bash
# backup.sh
SRC="/data/www"
DST="root@192.168.10.20:/mnt/backup/www"
LOG="/var/log/rsync_backup.log"
rsync -avzP --delete $SRC $DST >> $LOG 2>&1
加入定时任务,每天凌晨 2 点自动同步:
crontab -e
0 2 * * * /script/backup.sh
依赖:提前完成 SSH 免密配置,脚本无需手动输入密码。