跳到正文
约 2 分钟

使用 SSH 公钥免密登录服务器:从生成密钥到脚本化连接

在管理远程服务器时,每次输入密码不仅繁琐,还存在密码泄露的风险。使用 SSH 公钥认证可以既安全又便捷地连接服务器。本文将带您从零开始配置 SSH 密钥对,部署公钥到服务器,并最终使用一个简单的 Bash 脚本实现一键登录。


准备工作

  • 一台本地电脑(Windows / macOS / Linux 均可)
  • 一台远程服务器(IP、端口、用户名和密码已知)
  • 终端(命令行)环境

提示:本文示例中的服务器信息为占位符,实际操作时请替换为您自己的信息。

第一步:在本地生成 SSH 密钥对

SSH 支持多种密钥类型,推荐使用 Ed25519,它在安全性和性能上均有出色表现。

打开终端,执行以下命令:

ssh-keygen -t ed25519 -C "your_email@example.com"
  • -t ed25519 指定密钥类型。
  • -C 添加注释(通常为邮箱),便于识别。

交互提示

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519): 

直接按 Enter 使用默认路径 ~/.ssh/id_ed25519

Enter passphrase (empty for no passphrase):

建议设置一个密码短语(passphrase),即使私钥泄露也能提供额外保护。当然,如果追求极致便捷,也可以留空。

生成完成后,您会得到两个文件:

  • ~/.ssh/id_ed25519 —— 私钥(绝不可泄露)
  • ~/.ssh/id_ed25519.pub —— 公钥(可安全分发)

第二步:将公钥部署到远程服务器

您需要将本地生成的公钥内容添加到服务器的 ~/.ssh/authorized_keys 文件中。这里提供两种方法,推荐使用 ssh-copy-id

方法一:使用 ssh-copy-id(最便捷)

ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 user@host
  • -i 指定公钥文件。
  • -p 指定 SSH 端口(默认 22,若修改请替换)。
  • user@host 替换为实际用户名和 IP。

系统会提示输入服务器密码,输入后公钥将自动追加到服务器的 ~/.ssh/authorized_keys 中,并自动设置正确的权限。

方法二:手动复制(当 ssh-copy-id 不可用时)

  1. 查看并复制本地公钥内容:

    cat ~/.ssh/id_ed25519.pub
    

    选中输出的全部内容(以 ssh-ed25519 开头)复制到剪贴板。

  2. 使用密码登录服务器:

    ssh -p 22 user@host
    
  3. 在服务器上执行以下命令:

    mkdir -p ~/.ssh
    echo "粘贴您复制的公钥内容" >> ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    exit
    

    注意:echo 中的内容必须为公钥的完整一行,不要有多余空格或换行。

第三步:本地私钥权限修正(重要)

SSH 对私钥文件的权限要求非常严格,过于宽松的权限会导致连接被拒绝。在 Linux/macOS 上,执行:

chmod 600 ~/.ssh/id_ed25519

如果您使用的是 Windows 的 Git Bash 或 WSL,同样需要执行此命令。该步骤确保只有您自己可以读取私钥。

第四步:编写自动化连接脚本

为了方便日后连接,我们编写一个 Bash 脚本,它会自动携带私钥并连接到服务器。您可以根据需要修改脚本中的连接参数。

创建一个文件,例如 connect.sh,内容如下:

#!/bin/bash

# --------------------------
# 固定配置(根据需求修改这里)
# --------------------------
REMOTE_IP="host"                # 替换为您的服务器 IP 或域名
REMOTE_PORT="22"                # 替换为您的 SSH 端口(默认 22)
REMOTE_USER="user"              # 替换为您的服务器用户名
SSH_KEY="$HOME/.ssh/id_ed25519" # 替换为您的私钥路径(可选,默认用系统密钥)

# --------------------------
# 自动修复密钥权限(如果使用密钥认证)
# --------------------------
if [ -f "$SSH_KEY" ]; then
    chmod 600 "$SSH_KEY"  # SSH 密钥必须 600 权限,否则可能连接失败
fi

# --------------------------
# 执行 SSH 连接
# --------------------------
echo "正在连接服务器: $REMOTE_USER@$REMOTE_IP:$REMOTE_PORT"
ssh -p "$REMOTE_PORT" -i "$SSH_KEY" "$REMOTE_USER@$REMOTE_IP"

脚本说明

  • 变量配置:集中管理服务器地址、端口、用户名和私钥路径,方便修改。
  • 自动修复权限:脚本会检查私钥是否存在,并强制设置权限为 600,避免因权限问题导致连接失败。
  • 连接命令:使用 -p 指定端口,-i 指定私钥,最后跟上 user@host

赋予执行权限并测试

chmod +x connect.sh
./connect.sh

如果一切顺利,就直接登录到服务器,无需输入密码。

评论