要实现 rsync免密同步,需要通过 SSH 密钥认证代替密码验证。以下是详细步骤:
完整免密设置流程
1. 在本地服务器生成 SSH 密钥对
bash
复制
ssh-keygen -t rsa -b 4096
执行后会提示保存位置(直接回车使用默认位置)
提示输入密钥密码(直接回车留空,实现完全免密)
生成两个文件:
~/.ssh/id_rsa(私钥,保存在本地)
~/.ssh/id_rsa.pub(公钥,需要复制到远程服务器)
2. 复制公钥到远程服务器
bash
复制
ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@远程服务器IP
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.16
系统会提示输入远程服务器密码(这是最后一次需要输入密码)
成功后公钥会自动添加到远程服务器的 ~/.ssh/authorized_keys文件中
3. 测试 SSH 免密登录
bash
复制
ssh 用户名@远程服务器IP
ssh root@192.168.0.16
如果直接登录成功,说明密钥配置正确
如果失败,检查远程服务器上的文件权限(见下文)
4. 使用免密 rsync 同步
bash
复制
rsync -avz -e ssh /本地/路径/ 用户名@远程服务器IP:/远程/路径/
现在执行此命令将不再需要输入密码
关键权限设置(重要!)
如果免密登录失败,通常是因为权限问题:
在本地服务器检查:
bash
复制
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
在远程服务器检查:
bash
复制
# 登录到远程服务器后执行:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod go-w ~/ # 确保用户主目录没有过宽权限
高级配置选项
1. 指定非标准 SSH 端口
bash
复制
rsync -avz -e "ssh -p 2222" /本地/路径/ 用户名@远程服务器IP:/远程/路径/
2. 使用特定密钥文件
bash
复制
rsync -avz -e "ssh -i ~/.ssh/custom_key" /本地/路径/ 用户名@远程服务器IP:/远程/路径/
3. 在脚本中使用(避免密码提示)
bash
复制
#!/bin/bash
rsync -avz --rsh="ssh -o BatchMode=yes" /本地/路径/ 用户名@远程服务器IP:/远程/路径/
安全建议
保护私钥:
不要共享私钥文件
设置私钥文件权限为 600
避免在不安全设备上存储私钥
定期轮换密钥:
bash
复制
# 生成新密钥
ssh-keygen -t ed25519 -f ~/.ssh/new_key
# 复制新公钥到远程服务器
ssh-copy-id -i ~/.ssh/new_key.pub 用户名@远程服务器IP
# 删除旧密钥
rm ~/.ssh/id_rsa*
限制远程访问:
在远程服务器的 /etc/ssh/sshd_config中添加:
ini
复制
AllowUsers 用户名
PermitRootLogin no
验证免密同步
测试命令:
bash
复制
rsync -avz -n --dry-run /本地/路径/ 用户名@远程服务器IP:/远程/路径/
-n参数会模拟操作而不实际传输文件
如果没有任何密码提示,说明配置成功
常见问题解决
问题:仍提示输入密码
解决方案:
检查远程服务器 ~/.ssh/authorized_keys文件权限(应为 600)
检查远程服务器 SSH 日志:tail -f /var/log/secure
尝试详细模式:rsync -avvz查看详细错误
问题:权限被拒绝 (publickey)
解决方案:
确认远程服务器 sshd服务正在运行
检查 /etc/ssh/sshd_config中 PubkeyAuthentication yes是否启用
重启 SSH 服务:sudo systemctl restart sshd
按照这些步骤操作后,您就可以实现完全免密的 rsync 文件同步了。