# 🛡️ 使用 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_serveruser 是远程服务器的用户名, remote_server 是服务器的 IP 或域名。

🔧 权限设置说明:

  • ~/.ssh 目录权限设置为 700 (只有所有者可读写执行)
  • ~/.ssh/authorized_keys 文件权限设置为 600 (只有所有者可读写)
  • ~/.ssh/my_key 私钥权限设置为 600 (只有所有者可读写)
  • ~/.ssh/my_key.pub 公钥权限设置为 644 (所有者可读写,其他用户只读)

# 3️⃣ 测试 SSH 免密登录

执行以下命令测试 SSH 连接:

h
# 测试 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 免密登录配置成功。
🔍 常见问题排查:

  1. 检查权限:
    在远程服务器上执行
    ls -la ~/.ssh
    ls -la ~/.ssh/authorized_keys

  2. 检查 SSH 服务状态:

在远程服务器上执行
sudo systemctl status sshd

  1. 检查 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 时注意备份重要数据
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

ZJM 微信支付

微信支付

ZJM 支付宝

支付宝