Linux 服务器 SSH 免密登录 + rsync /scp/sftp 完整详解手册

一、前置核心:SSH 免密登录原理(所有工具底层都依赖它)

1. 免密原理

  1. 客户端生成非对称密钥对 :私钥(本地保管,绝不外传)、公钥(.pub,发给目标机器)
  2. 目标机器把客户端公钥写入 ~/.ssh/authorized_keys
  3. 客户端 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 致命缺点(不适合备份场景)

  1. 每次传输完整拷贝所有文件,不对比差异,修改少量文件也要重传全部
  2. 无断点续传,网络中断需要从头传输
  3. 无法过滤排除指定文件 / 目录

四、rsync 重点详解(生产首选,SSH 免密模式)

rsync 默认两种传输模式:

  1. ssh 模式(日常 99% 使用,复用 ssh 免密)rsync 文件 user@ip:路径
  2. rsync daemon 模式(独立端口,企业大规模集群同步用,文末补充)

基础语法(ssh 免密传输)

复制代码
# 本地推送至远程
rsync [参数] 本地路径 user@目标IP:远程目录
# 远程拉取到本地
rsync [参数] user@目标IP:远程目录 本地路径

必记核心参数(生产标准组合 -avz

  1. -a 归档模式(最关键):等价 -rlptgoD
    • r 递归目录;l 保留软链接;p 保留权限;t 保留修改时间;g/o 保留属组属主;D 保留设备文件
  2. -v verbose 打印详细传输日志,脚本排错必备
  3. -z 传输时压缩,跨机房低带宽必开
  4. -P = --progress --partial:显示传输进度 + 断点续传(超大文件神器)
  5. --delete 危险参数:删除目标端存在、本地不存在的文件(做镜像备份用)
  6. --exclude='xxx' 排除文件 / 目录,支持通配符
  7. --port=2222 指定 ssh 端口
  8. --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 优势总结

  1. 增量传输:只发送文件差异部分,重复同步速度极快
  2. 断点续传,网络断了不用重传整个文件
  3. 完整保留 Linux 文件权限、属主、软硬链接、时间戳
  4. 支持过滤、限速、删除冗余文件,完美适配定时备份脚本
  5. 可配合 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 账号,简单介绍:

  1. 服务端配置 /etc/rsyncd.conf 定义共享模块、权限、白名单

  2. 服务端启动 rsync --daemon

  3. 客户端同步语法(无 @,用双冒号)

    rsync -avz /data rsync://192.168.10.20/backup/

    简写

    rsync -avz /data 192.168.10.20::backup/

个人 / 中小型服务器同步优先用 ssh 免密 rsync,无需额外开放端口,安全简单。

八、生产使用选型总结(直接照着选)

  1. 定时备份、服务器文件同步、大目录增量更新 → rsync -avzP(ssh 免密)
  2. 临时拷贝少量小文件、一次性传输 → scp
  3. 手动登录浏览、交互式上传下载文件 → sftp
  4. 需要直接读写远程目录,像本地文件夹操作 → sshfs

九、常见排错(免密失效 / 传输报错)

  1. 仍提示输密码:检查 .ssh 目录、私钥、authorized_keys 权限必须 700/600
  2. SSH 自定义端口同步失败:scp 用 -P,rsync 用 --port,sftp 用 -oPort
  3. rsync 同步丢失权限:必须加 -a 参数
  4. 传输慢:添加 -z 压缩,配合 --bwlimit 合理限速
  5. 目标文件删不掉:--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 免密配置,脚本无需手动输入密码。