菜鸟科技网

SSH命令如何用私钥登录?

核心概念:SSH 密钥对

你需要理解 SSH 的工作原理:

SSH命令如何用私钥登录?-图1
(图片来源网络,侵删)
  1. 密钥对:它包含两个文件:

    • 私钥:这是你的身份证明,必须严格保密,绝对不能泄露给任何人,它存储在你的本地计算机上。
    • 公钥:这是你的身份副本,可以安全地分享给任何人,你需要将它复制到你想连接的远程服务器上。
  2. 工作流程

    • 当你尝试通过 SSH 连接到服务器时,服务器会要求你进行身份验证。
    • 你会提供你的私钥
    • 服务器会用你之前存放在那里的公钥来验证你的私钥是否匹配。
    • 如果匹配成功,服务器就确认了你的身份,允许你登录。

这个过程比传统的密码登录更安全,因为私钥不会被在网络上传输,而且通常比复杂密码更难被暴力破解。


生成 SSH 密钥对

如果你的本地计算机上还没有 SSH 密钥对,你需要先生成一个。

SSH命令如何用私钥登录?-图2
(图片来源网络,侵删)

打开你的终端(在 macOS/Linux 上)或 PowerShell/CMD(在 Windows 上),运行以下命令:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

参数解释:

  • -t rsa:指定密钥类型为 RSA,RSA 仍然是广泛使用的标准,你也可以使用 ed25519-t ed25519),它更新、更快、更安全,但可能需要较新的服务器支持。
  • -b 4096:指定密钥的位长为 4096 位,位数越长,安全性越高。
  • -C "your_email@example.com":为你的密钥添加一个注释,这通常是一个邮箱地址,方便你识别这个密钥是哪个设备或用途的。

执行过程:

  1. 选择保存位置

    SSH命令如何用私钥登录?-图3
    (图片来源网络,侵删)
    Enter file in which to save the key (/home/user/.ssh/id_rsa):

    直接按回车键,接受默认路径 ~/.ssh/id_rsa,这是 SSH 客户端默认查找私钥的位置。

  2. 设置密码(可选但强烈推荐)

    Enter passphrase (empty for no passphrase):

    系统会要求你输入一个密码(称为 "passphrase"),这个密码是为你的私钥本身设置的加密密码。

    • 强烈建议设置! 这样即使有人窃取了你的私钥文件,没有这个密码也无法使用。
    • 如果你不想每次连接都输入密码,可以使用 ssh-agent 来缓存它(稍后介绍)。
    • 如果不想设置,直接按回车键(不推荐)。
  3. 确认密码

    Enter same passphrase again:

    再次输入密码。

完成后,你会在 ~/.ssh/ 目录下找到两个文件:

  • id_rsa:你的私钥
  • id_rsa.pub:你的公钥

将公钥复制到远程服务器

你需要将公钥(id_rsa.pub添加到远程服务器的 ~/.ssh/authorized_keys 文件中,这个文件列出了所有被允许使用密钥登录该服务器的公钥。

有几种方法可以实现:

使用 ssh-copy-id 命令(最简单、最推荐)

如果你的本地系统支持 ssh-copy-id 命令,这是最简单的方法。

ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_server_ip

参数解释:

  • -i ~/.ssh/id_rsa.pub:指定你的公钥文件路径,如果默认就是 id_rsa.pub,可以省略。
  • user@remote_server_ip:你的远程服务器用户名和 IP 地址或域名。

执行后,系统会提示你输入 user 用户的登录密码ssh-copy-id 会自动完成以下操作:

  1. 通过密码登录到服务器。
  2. 在服务器上创建 ~/.ssh 目录(如果不存在)。
  3. 将你的公钥内容追加到 ~/.ssh/authorized_keys 文件中。
  4. 设置正确的文件权限(authorized_keys 文件权限必须是 600.ssh 目录权限必须是 700)。

手动复制(ssh-copy-id 不可用)

  1. 查看并复制公钥内容

    cat ~/.ssh/id_rsa.pub

    这会输出一长串以 ssh-rsa 开头,以你的邮箱结尾的文本。完整地复制这一整行文本

  2. 登录到服务器并添加公钥

    ssh user@remote_server_ip

    使用密码登录到服务器。

  3. 在服务器上创建/编辑文件

    mkdir -p ~/.ssh
    echo "粘贴你刚才复制的公钥内容到这里" >> ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    • >> 表示将内容追加到文件末尾。
    • chmod 命令用于设置文件权限,这是 SSH 安全所必需的。

使用私钥进行 SSH 连接

一切准备就绪,你可以使用私钥进行连接了。

基本用法

如果你的私钥文件是默认的 ~/.ssh/id_rsa,并且已经通过 ssh-agent 添加了密码(或者没有设置密码),你可以直接连接:

ssh user@remote_server_ip

SSH 客户端会自动在 ~/.ssh/ 目录下寻找名为 id_rsaid_ecdsaid_ed25519 等的私钥文件。

指定私钥文件(-i 选项)

如果你的私钥文件不是默认名称,或者存放在其他位置,你需要使用 -i 选项来明确指定。

ssh -i /path/to/your/private_key user@remote_server_ip

示例: 假设你的私钥文件在 ~/Documents/my_keys/github_key,连接命令就是:

ssh -i ~/Documents/my_keys/github_key git@github.com

处理私钥密码(Passphrase)

如果你在生成私钥时设置了密码,每次使用这个私钥连接时,系统都会提示你输入密码。

为了避免每次都输入,你可以使用 ssh-agent 来在后台缓存你的私钥密码。

在 macOS 或现代 Linux 系统上:

  1. 启动 ssh-agent
    eval "$(ssh-agent -s)"
  2. 添加私钥到 agent
    ssh-add ~/.ssh/id_rsa

    系统会提示你输入一次私钥的密码,之后,只要你的终端会话没有关闭,再次使用 SSH 连接时就无需再输入密码了。


常见问题与技巧

连接时提示 Permission denied (publickey).

这通常意味着:

  • 远程服务器上的 ~/.ssh/authorized_keys 文件中没有你的公钥。
  • 文件或目录权限不正确,确保:
    • 远程服务器上 ~/.ssh 目录的权限是 700 (chmod 700 ~/.ssh)。
    • 远程服务器上 authorized_keys 文件的权限是 600 (chmod 600 ~/.ssh/authorized_keys)。
  • 本地私钥文件权限太开放,确保本地私钥文件 ~/.ssh/id_rsa 的权限是 600 (chmod 600 ~/.ssh/id_rsa)。

连接时提示 Could not resolve hostname

检查你输入的远程服务器 IP 地址或域名是否正确。

为不同的服务器使用不同的密钥

你可以为不同的项目或服务器创建不同的密钥对,并在 ~/.ssh/config 文件中进行配置,这样就不需要每次都手动指定 -i

编辑 ~/.ssh/config 文件:

# 编辑配置文件
nano ~/.ssh/config

添加如下内容:

# 为服务器 'web-server' 配置
Host web-server
    HostName 192.168.1.100
    User admin
    IdentityFile ~/.ssh/web_server_key
# 为 GitHub 配置
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_key

你可以使用更简单的命令连接:

ssh web-server
ssh github
步骤 命令/操作 描述
生成密钥 ssh-keygen -t rsa -b 4096 -C "email" 在本地创建私钥和公钥对。
复制公钥 ssh-copy-id user@host (推荐) 将公钥安全地添加到远程服务器。
手动复制 cat id_rsa.pub + 手动添加到服务器 手动复制公钥内容到服务器的 authorized_keys 文件。
连接 ssh user@host 使用默认私钥连接。
指定私钥 ssh -i /path/to/key user@host 当私钥文件名或位置不是默认时使用。
缓存密码 eval "$(ssh-agent -s)" + ssh-add key 避免每次 SSH 连接都输入私钥的密码。
配置别名 编辑 ~/.ssh/config 为不同服务器创建简洁的连接别名。

遵循以上步骤,你就可以安全、高效地使用 SSH 私钥进行连接了。

分享:
扫描分享到社交APP
上一篇
下一篇