avatar

目录
ssh 密钥配置

Ssh 密钥配置

这是一个涉及到 Cloudflare Tunnel (云端隧道)ProxyCommand 的高级 SSH 连接配置。

在这种特殊情况下,您不能使用标准的 ssh-copy-id 命令来复制公钥,因为标准的 ssh-copy-id 流程无法直接处理 ProxyCommand 所定义的复杂隧道连接。

这里的连接实际上分成了两个步骤:

  1. 本地运行 cloudflared.exe 建立安全的 Cloudflare 隧道连接。
  2. SSH 客户端通过这个隧道连接到服务器。

要在这种配置下实现免密码登录,您需要采取变通的方法:


解决方案概述

由于 ssh-copy-id 无法使用,我们需要执行 手动公钥复制,但必须确保手动复制的 SSH 连接也能使用 ProxyCommand

核心步骤:

  1. 准备密钥: 确保您已经完成了本地密钥对的生成(如果还没有)。
  2. 验证连接: 确认当前的配置别名 ssh-lovexy 已经可以成功连接(需要手动输入密码)。
  3. 提取公钥: 拿到您的公钥内容。
  4. 远程操作: 通过 SSH 登录到服务器,并手动将公钥内容写入远程服务器的 ~/.ssh/authorized_keys 文件中。

详细操作步骤

步骤 1:确保本地密钥就绪

如果您还没有密钥对,请先遵循标准步骤创建:

bash
1
2
ssh-keygen -t ed25519 -C "[email protected]_key"
# 强烈建议设置 Passphrase

私钥路径默认为 ~/.ssh/id_ed25519.pub

步骤 2:提取您的公钥内容

使用 cat 命令查看并复制完整的公钥内容。请确保您复制的是 公钥文件 (.pub)

bash
1
cat ~/.ssh/id_ed25519.pub

输出应该像这样(这是一行很长的文本):

Code
1
ssh-ed25519 AAAA... (非常长的字符串) [email protected]_key

步骤 3:通过 Cloudflare Tunnel 连接到远程服务器

我们将使用您已有的配置 ssh-lovexy 进行 SSH 登录。

在终端中执行以下命令,使用您的别名连接服务器:

bash
1
ssh ssh-lovexy

此时,连接会通过 cloudflared.exe 建立隧道。

  • 如果 您设置了 SSH Agent 并且加入了私钥,您现在需要输入的是私钥的 Passphrase。
  • 如果 您使用的是服务器密码,您需要输入的是服务器 washme 用户的密码。

目的: 确保您能够成功进入远程服务器的命令行界面。

步骤 步骤 4:在服务器上手动添加公钥

一旦您通过 ssh ssh-lovexy 命令成功登录到远程服务器(服务器用户是 washme),请执行以下命令来创建或编辑 authorized_keys 文件。

⚠️ 注意: 确保您处于远程服务器的命令行环境。

  1. 创建或确认 .ssh 目录存在并设置正确权限:

    bash
    1
    2
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
  2. 将您的公钥内容写入 authorized_keys 文件:
    使用 echo 命令,将您在 步骤 2 中复制的完整公钥内容粘贴进去。

    关键操作:

    bash
    1
    echo "ssh-ed25519 AAAA... (您在步骤 2 复制的公钥内容) [email protected]_key" >> ~/.ssh/authorized_keys
    • 使用 >> (双大于号) 是为了追加内容,避免覆盖可能已有的其他密钥。
  3. 设置 authorized_keys 文件的权限:

    bash
    1
    chmod 600 ~/.ssh/authorized_keys
  4. 退出远程会话:

    bash
    1
    exit

步骤 5:测试免密码连接

返回本地终端,再次使用别名尝试连接:

bash
1
ssh ssh-lovexy

预期结果

  1. 如果您的私钥没有设置密码短语 (Passphrase) 或已通过 SSH Agent 加载:
    🚀 您应该立即无需任何输入即可连接到服务器。

  2. 如果您的私钥设置了密码短语,但未启动 SSH Agent:
    您将被要求输入 私钥的密码短语(而不是服务器的密码)。一旦输入,连接成功。

  3. 如果已经启动 SSH Agent 并且加载了私钥 (ssh-add):
    🚀 您应该无需输入任何信息即可连接,彻底实现免密登录。


专家级考量:使用 -i~/.ssh/config 整合

为了让 SSH 客户端明确知道应该使用哪个密钥文件,即使您已经使用了默认路径(如 id_ed25519),也强烈建议~/.ssh/config 中明确指定。

请修改您的配置,添加 IdentityFile 字段:

bash
1
2
3
4
5
6
Host ssh-lovexy 
Hostname ssh.lovexy.me
User washme
Port 22
IdentityFile ~/.ssh/id_ed25519 <----- 添加此行,指向您的私钥文件
ProxyCommand "C:\Program Files (x86)\cloudflared\cloudflared.exe" access ssh --hostname %h

通过这种方式,VS Code Remote SSH 和您的本地 SSH 客户端在连接 ssh-lovexy 时,会:

  1. 启动 cloudflared.exe 建立隧道。
  2. 通过该隧道尝试使用 IdentityFile 中指定的私钥进行认证。
  3. 如果私钥需要 Passphrase,则由 SSH Agent(或 VS Code 提示)处理。

替代方案:一步到位(针对某些环境)

在某些现代 SSH 客户端或启用了 WSL 的环境中,可以尝试手动模拟 ssh-copy-id 的逻辑,并带上 ProxyCommand,但这依赖于 SSH 客户端如何解析和执行命令。

例如:

bash
1
cat ~/.ssh/id_ed25519.pub | ssh -o ProxyCommand='...\cloudflared.exe access ssh --hostname %h' [email protected] 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'

您需要将 ProxyCommand 的部分替换为您配置文件中的完整路径和参数,并用引号包围。如果您在 Windows Bash 环境下执行,需要特别注意路径和转义字符。手动登录后执行 echo 是最可靠且兼容性最好的方法。


建议的下一步行动 (Suggested Follow-up Actions)

  1. 确认公钥内容: 帮您再次复查公钥内容格式是否正确,并确保已正确添加 IdentityFile~/.ssh/config
  2. SSH Agent 设置优化: 帮助您检查并设置 Windows 系统上的 OpenSSH Agent 或 Git Bash 环境,确保私钥 Passphrase 能够被缓存,实现真正的无感知连接。
  3. Cloudflared 路径检查: 尽管配置文件中路径是绝对路径,我们还可以检查 VS Code 在执行 ProxyCommand 时是否能顺利找到 cloudflared.exe,确保连接前置步骤没有失败。

评论