# 🛡️ 使用 SSH 免密登录优化 rsync 远程同步
在 macOS 本地使用 rsync
同步到远程服务器时,每次输入密码会降低效率。本文介绍如何配置 SSH 免密登录,使 rsync
传输文件时不再需要输入密码。
# 1️⃣ 生成 SSH 密钥
在本地终端执行以下命令生成 SSH 密钥:
# 生成 SSH 密钥 | |
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/my_key | |
# 设置私钥权限(安全起见) | |
chmod 600 ~/.ssh/my_key | |
chmod 644 ~/.ssh/my_key.pub |
📌 参数解析:
- 🔑
-t rsa
:指定密钥类型为 RSA。 - 🔒
-b 4096
:密钥长度为 4096 位,提高安全性。 - 📝
-C "your_email@example.com"
:添加注释,方便管理。 - 📂
-f ~/.ssh/my_key
:指定私钥存储路径及文件名(对应的公钥文件为~/.ssh/my_key.pub
)。
运行后,终端会生成以下文件: - 🔐 私钥:
~/.ssh/my_key
- 📜 公钥:
~/.ssh/my_key.pub
# 2️⃣ 复制公钥到远程服务器
可以使用 ssh-copy-id
直接复制公钥到远程服务器:
# 方法 1:使用 ssh-copy-id(推荐) | |
ssh-copy-id -i ~/.ssh/my_key.pub user@remote_server | |
# 方法 2:手动复制(如果 ssh-copy-id 不可用) | |
cat ~/.ssh/my_key.pub | ssh user@remote_server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh" |
📌 参数解析:
- 📂
-i ~/.ssh/my_key.pub
:指定要复制的公钥文件路径。 - 🌍
user@remote_server
:user
是远程服务器的用户名,remote_server
是服务器的 IP 或域名。
🔧 权限设置说明:
~/.ssh
目录权限设置为700
(只有所有者可读写执行)~/.ssh/authorized_keys
文件权限设置为600
(只有所有者可读写)~/.ssh/my_key
私钥权限设置为600
(只有所有者可读写)~/.ssh/my_key.pub
公钥权限设置为644
(所有者可读写,其他用户只读)
# 3️⃣ 测试 SSH 免密登录
执行以下命令测试 SSH 连接:
# 测试 SSH 连接 | |
ssh -i ~/.ssh/my_key user@remote_server | |
# 使用 -v 参数查看详细连接信息(用于调试) | |
ssh -v -i ~/.ssh/my_key user@remote_server | |
# 使用 -vv 参数查看更详细的连接信息 | |
ssh -vv -i ~/.ssh/my_key user@remote_server | |
# 使用 -vvv 参数查看最详细的连接信息 | |
ssh -vvv -i ~/.ssh/my_key user@remote_server |
✅ 如果无需输入密码即可登录,则 SSH 免密登录配置成功。
🔍 常见问题排查:
检查权限:
在远程服务器上执行
ls -la ~/.ssh
ls -la ~/.ssh/authorized_keys检查 SSH 服务状态:
在远程服务器上执行
sudo systemctl status sshd
- 检查 SSH 日志:
在远程服务器上执行
sudo tail -f /var/log/auth.log
# 4️⃣ 使用 rsync 进行远程同步
SSH 免密登录配置完成后,可以使用 rsync
进行文件同步。例如:
# 基本同步命令 | |
rsync -avz -e "ssh -i ~/.ssh/my_key" ~/local/path/ user@remote_server:/remote/path/ | |
# 使用 --delete 参数删除目标目录中源目录没有的文件 | |
rsync -avz --delete -e "ssh -i ~/.ssh/my_key" ~/local/path/ user@remote_server:/remote/path/ | |
# 使用 --exclude 参数排除特定文件或目录 | |
rsync -avz --exclude '*.log' --exclude 'node_modules/' -e "ssh -i ~/.ssh/my_key" ~/local/path/ user@remote_server:/remote/path/ | |
# 使用 --progress 参数显示传输进度 | |
rsync -avz --progress -e "ssh -i ~/.ssh/my_key" ~/local/path/ user@remote_server:/remote/path/ |
📌 参数解析:
- 📦
-a
:归档模式,保持文件属性(权限、时间戳等)。 - 📢
-v
:显示详细输出信息。 - ⚡
-z
:启用压缩,加快传输速度。 - 🔑
-e "ssh -i ~/.ssh/my_key"
:指定 SSH 使用的私钥文件。 - 📂
~/local/path/
:本地目录路径。 - 🌐
user@remote_server:/remote/path/
:远程服务器的目标路径。 - 🗑️
--delete
:删除目标目录中源目录没有的文件。 - 🚫
--exclude
:排除特定文件或目录。 - 📊
--progress
:显示传输进度。
# 5️⃣ 可选优化:配置 SSH 别名
如果经常连接同一台服务器,可以在 ~/.ssh/config
配置 SSH 别名,简化命令:
# 创建或编辑 SSH 配置文件 | |
mkdir -p ~/.ssh | |
touch ~/.ssh/config | |
chmod 600 ~/.ssh/config |
# ~/.ssh/config 文件内容 | |
Host myserver | |
HostName remote_server | |
User user | |
IdentityFile ~/.ssh/my_key | |
Port 22 | |
ServerAliveInterval 60 | |
ServerAliveCountMax 3 | |
Compression yes | |
TCPKeepAlive yes |
然后使用以下命令同步文件:
# 使用别名进行同步 | |
rsync -avz ~/local/path/ myserver:/remote/path/ | |
# 使用别名直接 SSH 连接 | |
ssh myserver |
📌 SSH 配置参数说明:
HostName
:服务器地址User
:用户名IdentityFile
:私钥文件路径Port
:SSH 端口(默认 22)ServerAliveInterval
:每 60 秒发送一次保活信号ServerAliveCountMax
:最多尝试 3 次保活Compression
:启用压缩TCPKeepAlive
:保持 TCP 连接活跃
# 🎯 结论
通过 SSH 免密登录,可以避免 rsync
传输文件时每次输入密码,提升文件同步的效率和便利性。本文介绍了 ssh-keygen
生成密钥、 ssh-copy-id
复制公钥、SSH 免密登录测试以及 rsync
远程同步的完整流程,希望对你有所帮助! 🚀
💡 提示:
- 请妥善保管私钥文件,不要分享给他人
- 定期更换密钥对以提高安全性
- 建议使用 SSH 配置文件管理多个服务器连接
- 使用 rsync 时注意备份重要数据