一、前置核心: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 -y2. 挂载 & 卸载(免密直接生效)
# 创建本地挂载点 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 免密配置,脚本无需手动输入密码。