Ubuntu 18.04 SSH密钥配置实战:ed25519密钥生成与Remote-SSH连接

Ubuntu 18.04 SSH密钥配置实战:ed25519密钥生成与Remote-SSH连接

1. 项目概述:为什么在 Ubuntu 18.04 上配 SSH 密钥不是“可选项”,而是必须迈过的门槛

你刚在腾讯云或阿里云上开了一台 Ubuntu 18.04 的轻量应用服务器,想用 VS Code 的 Remote-SSH 插件连上去写代码;或者你正为 Git 推送总要输密码而烦躁,想把 GitHub、GitLab 的 SSH 密钥一次性配稳;又或者你正在搭建一个自动化部署流水线,需要让 Jenkins 或 Ansible 脚本静默登录多台服务器——这时候,系统会冷不丁弹出一句:“ssh: connect to host xxx port 22: Connection refused” 或更让人抓狂的 “Permission denied (publickey)”。别急着重装 OpenSSH 或怀疑防火墙,90% 的这类问题,根源不在网络,而在密钥体系本身没立住。Ubuntu 18.04 是一个承前启后的关键版本:它默认启用 OpenSSH 7.6p1,已弃用弱算法(如 ssh-rsa with SHA-1),但尚未默认启用 ed25519;它仍广泛用于企业内网旧服务、嵌入式开发环境(比如配合 ESP32-S3 的调试桥接)、以及大量遗留 CI/CD 流水线中。这意味着,你不能照搬 Ubuntu 22.04 或 Debian 12 的配置逻辑,稍有偏差,就会触发ssh: could not resolve hostname d: name or service not known这类看似 DNS 问题、实则因密钥协商失败导致客户端提前退出的“伪错误”。我过去三年帮客户排查过 137 例远程连接异常,其中 68 例直接源于 Ubuntu 18.04 下ssh-keygen参数选错、authorized_keys权限失控、或sshd_configPubkeyAuthenticationPasswordAuthentication的开关逻辑被误设。这不是“配个密钥而已”的小活儿,而是一套涉及密钥生成、分发、服务端加载、客户端代理、甚至 VS Code Remote-SSH 插件底层握手机制的完整链路。它直接影响你能否用scp安全传文件、能否让git clone git@github.com:user/repo.git一气呵成、能否在跨局域网场景下通过跳板机稳定连接——这些热搜词背后,全是真实工作流里的卡点。如果你是开发者、运维工程师、DevOps 工程师,或是正在用 WSL2 + Ubuntu 18.04 做本地开发环境的同学,这篇内容就是为你写的实操手册,不讲理论推导,只说你在终端里敲什么、为什么这么敲、敲错后怎么救。

2. 整体设计思路:为什么不用密码登录?密钥体系到底在解决什么问题

2.1 密码登录的三大硬伤,Ubuntu 18.04 环境下尤其致命

很多人觉得“输密码挺快啊,何必折腾密钥?”——这是没经历过生产环境暴击的真实写照。在 Ubuntu 18.04 上,密码登录存在三个无法绕开的结构性缺陷:

第一是暴力破解面暴露过大。OpenSSH 默认监听 22 端口,只要你的服务器有公网 IP,Botnet 扫描器每分钟都在尝试root/admin/ubuntu等常见用户名+弱密码组合。Ubuntu 18.04 的faillog日志里,我见过单日超 12,000 次失败登录尝试。而密钥登录天然免疫暴力破解:攻击者没有私钥,光靠穷举公钥根本不可能反推出私钥(RSA-2048 的穷举时间远超宇宙年龄)。

第二是自动化脚本彻底失效。设想一个 Jenkins 构建任务:拉代码 → 编译 → 用scp上传二进制包到测试服务器 → 重启服务。如果目标服务器只允许密码登录,Jenkins 就得把密码明文写进脚本或凭据管理器——这违反所有安全基线(PCI DSS、等保2.0),且一旦 Jenkins 被入侵,整条产线密钥瞬间泄露。而密钥登录只需ssh -i /path/to/id_rsa user@host 'systemctl restart myapp',全程无交互、无明文密码。

第三是VS Code Remote-SSH 和 Git 协议深度耦合。VS Code 的 Remote-SSH 插件并非简单封装ssh命令,它会在首次连接时自动调用ssh-keyscan获取主机公钥指纹,并将其写入~/.ssh/known_hosts;后续连接若指纹变更(如重装系统),会直接中断并报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!。而 Git 的git@协议完全依赖 SSH 通道:当你执行git push,Git 客户端实际是调用ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null git@github.com 'git-receive-pack '\''user/repo.git'\'''。如果密钥未正确加载或代理未启用,git push就会卡在Permission denied (publickey),而不是提示你输密码——因为 Git 默认禁用密码回退机制。

2.2 Ubuntu 18.04 的密钥方案选型:为什么首选 ed25519,而非 RSA?

ssh-keygen支持多种算法:rsadsaecdsaed25519。在 Ubuntu 18.04 上,必须明确拒绝dsa(OpenSSH 7.0+ 已禁用)和ecdsa(NIST 曲线存在潜在后门争议),并在rsaed25519间做选择。

rsa看似稳妥:ssh-keygen -t rsa -b 4096生成 4096 位密钥,兼容性极佳。但它有两个隐藏成本:一是计算慢——RSA 签名验签需大数模幂运算,在树莓派或低配 VPS 上,每次 SSH 连接握手延迟增加 80~120ms;二是密钥体积大——id_rsa.pub文件长达 736 字符,粘贴到 GitHub/GitLab Web 界面时极易漏字符。

ed25519是更好的答案。它基于 Edwards 曲线,由 Daniel J. Bernstein 设计,256 位密钥强度等效于 RSA-3072,但签名速度比 RSA 快 10 倍以上,公钥仅 68 字符(ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...),且 Ubuntu 18.04 的 OpenSSH 7.6p1 原生支持(无需升级)。我实测过:在同一台 1C1G 的腾讯云轻量服务器上,ed25519密钥的 SSH 连接建立耗时稳定在 42ms,而rsa-4096平均达 137ms。更重要的是,ed25519天然抗侧信道攻击(timing attack),私钥不会因 CPU 缓存访问时间差异泄露——这对运行在共享宿主机(如云平台)上的 Ubuntu 18.04 实例尤为关键。

提示:不要用-N ""直接生成无密码私钥。虽然省事,但一旦私钥文件被盗(比如误传到 GitHub),攻击者可立即登录所有授权服务器。正确做法是设一个强密码(如openssl rand -base64 12 | tr -d "=+/"生成 12 位随机字符串),再用ssh-agent缓存解密后的私钥句柄。这样既保安全,又免重复输密。

2.3 整体架构:客户端生成 → 安全分发 → 服务端加载 → 客户端验证,四步闭环

整个流程不是单向操作,而是一个闭环验证链:

  1. 客户端生成:在你的开发机(可能是 Windows 10 WSL2 中的 Ubuntu 18.04,也可能是 macOS 或物理 Linux 机)运行ssh-keygen -t ed25519 -C "your_email@example.com",生成id_ed25519(私钥)和id_ed25519.pub(公钥)。注意-C参数不是可选,它是密钥的注释字段,会被写入authorized_keys,当服务器上有多个密钥时,靠它快速识别来源(比如work-laptophome-desktop)。

  2. 安全分发:绝不用scprsync手动传公钥文件!ssh-copy-id是唯一推荐方式。它本质是执行ssh user@host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys",但关键在于:它会自动校验目标服务器的主机公钥指纹,防止中间人劫持;且只追加公钥,不覆盖已有密钥。若ssh-copy-id不可用(如目标服务器禁用密码登录),则必须手动cat id_ed25519.pub | ssh user@host "tee -a ~/.ssh/authorized_keys > /dev/null",并严格检查~/.ssh/authorized_keys文件权限是否为600

  3. 服务端加载:Ubuntu 18.04 的/etc/ssh/sshd_config默认已启用PubkeyAuthentication yes,但常被管理员为“安全起见”改成no。必须确认该行未被注释且值为yes;同时检查AuthorizedKeysFile .ssh/authorized_keys是否指向正确路径(默认即此);最关键的是StrictModes yes——它强制要求~/.ssh目录权限 ≤700、authorized_keys文件权限 ≤600,否则 SSHD 直接忽略该文件。

  4. 客户端验证:连接时用ssh -vT user@host-v开启详细日志,-T禁用伪终端),观察日志中是否出现debug1: Next authentication method: publickeydebug1: Authentication succeeded (publickey)。若卡在publickey后 fallback 到password,说明服务端未加载密钥;若直接报No more authentication methods to try,则是客户端未找到可用私钥——此时需检查ssh-add -l是否列出密钥,或用ssh -i ~/.ssh/id_ed25519 user@host强制指定私钥路径。

这个闭环里,任何一环断裂都会导致Permission denied (publickey)。而 Ubuntu 18.04 的老旧内核和 OpenSSH 版本,会让某些断裂点更隐蔽,比如sshd进程未重载配置、SELinux 上下文错误(虽 Ubuntu 默认不用 SELinux,但某些定制镜像会启用)、或umask设置导致新建.ssh目录权限为755(被StrictModes拒绝)。所以,必须按顺序逐环验证,不能跳步。

3. 核心细节解析:从密钥生成到 VS Code 连接,每个环节的魔鬼参数

3.1ssh-keygen的 7 个关键参数,90% 的人只用了 2 个

ssh-keygen命令看似简单,但其参数组合决定了密钥的安全性、兼容性和易用性。在 Ubuntu 18.04 环境下,以下参数必须精准控制:

  • -t ed25519:强制指定算法。不要省略,避免ssh-keygen在旧系统上默认回退到rsa

  • -b 4096仅对rsa有效。对ed25519使用此参数会报错Invalid key length: 4096ed25519固定 256 位,无需指定长度。

  • -C "your_email@example.com":注释字段。它不参与加密,但会被写入公钥末尾,也是ssh-add -l显示的标识。务必填写有意义的内容,比如alice@work-mac,而非空字符串或test

  • -f ~/.ssh/id_ed25519_work:指定私钥文件名。强烈建议为不同用途创建独立密钥对,如id_ed25519_githubid_ed25519_vpsid_ed25519_vscode。这样即使某一台设备失窃,只需吊销对应公钥,不影响其他服务。

  • -N "my_strong_passphrase":设置私钥密码。如前所述,绝不为空。密码应满足:长度 ≥12,含大小写字母+数字+符号,避免字典词。可用pwgen -s -y -1 12生成。

  • -q:静默模式。避免在脚本中输出冗余提示,但首次交互式生成时不建议用,以防错过关键确认信息。

  • -E sha256:指定公钥指纹哈希算法。Ubuntu 18.04 默认用 SHA256,但某些老旧客户端可能只认 MD5。若需兼容,可加-E md5,但安全性降低,仅作临时过渡。

我曾遇到一个案例:某客户用ssh-keygen -t rsa生成密钥后,发现 VS Code Remote-SSH 连接时反复提示The process tried to write to a nonexistent pipe。查日志发现,VS Code 的 SSH 客户端(基于 node-pty)在解析id_rsa.pub时,因公钥末尾注释含中文(-C "张三的笔记本"),触发了 UTF-8 解码异常。改用英文注释zhangsan-work-laptop后立即解决。这说明,-C字段不仅是标识,更是影响客户端解析的元数据。

3.2ssh-copy-id的底层逻辑与 3 种失效场景应对

ssh-copy-id是最安全的公钥分发工具,但它并非万能。理解其内部机制,才能在失效时快速定位:

它实际执行三步原子操作:

  1. ssh user@host "umask 077; mkdir -p ~/.ssh"—— 创建目录并设权限为700
  2. ssh user@host "umask 077; touch ~/.ssh/authorized_keys"—— 创建文件并设权限为600
  3. ssh user@host "umask 077; cat >> ~/.ssh/authorized_keys"—— 追加公钥内容。

失效场景一:目标用户家目录不在/home/user
Ubuntu 18.04 默认用户家目录确实在/home,但若你用useradd -d /opt/myapp user创建用户,ssh-copy-id会尝试写入/home/user/.ssh,而该路径不存在。此时需手动指定路径:ssh-copy-id -i ~/.ssh/id_ed25519.pub "-o UserKnownHostsFile=/dev/null" user@host,然后登录后手动mkdir -p /opt/myapp/.ssh && chmod 700 /opt/myapp/.ssh

失效场景二:sshd_configAuthorizedKeysFile被修改
有些安全加固脚本会将公钥文件改为/etc/ssh/keys/%u/authorized_keys。此时ssh-copy-id仍写入~/.ssh/authorized_keys,但sshd根本不读它。解决方案:先ssh user@host "grep AuthorizedKeysFile /etc/ssh/sshd_config"查真实路径,再用sudo cp ~/.ssh/authorized_keys /etc/ssh/keys/user/authorized_keyssudo chmod 600 /etc/ssh/keys/user/authorized_keys

失效场景三:~/.ssh目录属主不是当前用户
常见于sudo su -切换用户后生成密钥,导致~/.ssh属主为rootsshd严格检查:若~/.ssh属主不是登录用户,直接拒绝加载密钥。修复命令:sudo chown -R $USER:$USER ~/.ssh

注意:ssh-copy-id默认使用ssh命令的配置,因此它会读取~/.ssh/config中的Host别名、端口、用户等设置。若你的config文件里有Host myserver\n HostName 192.168.1.100\n User alice,那么ssh-copy-id myserver会自动应用这些参数,无需重复输入。

3.3sshd_config的 5 个必调参数,Ubuntu 18.04 的“老古董”陷阱

Ubuntu 18.04 的/etc/ssh/sshd_config文件默认配置较宽松,但生产环境必须收紧。以下是 5 个直接影响密钥登录成败的核心参数:

  • PubkeyAuthentication yes必须开启。若为no,无论密钥多完美,sshd都不处理公钥认证。检查方法:sudo grep -i "pubkeyauthentication" /etc/ssh/sshd_config

  • PasswordAuthentication no密钥登录稳定后才关闭。切勿在首次配置密钥前就设为no,否则可能把自己锁在门外。建议流程:先确保密钥登录 100% 成功 → 再改此参数为nosudo systemctl reload sshd→ 最后新开一个终端验证密码登录是否真的被禁用。

  • PermitRootLogin prohibit-password:允许 root 登录,但仅限密钥。若设为yes,root 可用密码登录,极大增加风险;若设为no,则完全禁止 root 登录,需用普通用户sudoprohibit-password是最佳平衡点。

  • MaxAuthTries 3:单次连接最多尝试 3 次认证。防止暴力枚举。Ubuntu 18.04 默认即 3,无需修改,但需确认未被注释。

  • KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256:密钥交换算法列表。Ubuntu 18.04 默认包含diffie-hellman-group14-sha256,但某些新客户端(如新版 OpenSSH)会优先尝试curve25519-sha256@libssh.org。若此列表中缺少客户端支持的算法,连接会报no matching key exchange method found。解决方案:在列表开头添加curve25519-sha256@libssh.org,并确保sshd版本 ≥7.6(Ubuntu 18.04 满足)。

一个经典陷阱:某客户在sshd_config中添加了UsePAM yes,却忘记在/etc/pam.d/sshd中配置 PAM 模块,导致sshd启动时静默失败,systemctl status sshd显示active (exited)而非active (running)。此时所有 SSH 连接都会Connection refused,看似网络问题,实为 PAM 配置错误。因此,每次修改sshd_config后,必须执行sudo sshd -t(语法检查)和sudo systemctl reload sshd(平滑重载),而非restart

3.4 VS Code Remote-SSH 的 4 层配置穿透,解决ssh: connect to host ... network is unreachable

VS Code 的 Remote-SSH 插件是 Ubuntu 18.04 开发者的刚需,但它不是简单的ssh封装,而是四层叠加的复杂系统:

第一层:VS Code 自身的 SSH 配置
在 VS Code 中按Ctrl+Shift+P→ 输入Remote-SSH: Open Configuration File→ 选择~/.ssh/config。这里必须定义清晰的Host块:

Host my-vps HostName 123.45.67.89 User ubuntu IdentityFile ~/.ssh/id_ed25519_vps Port 22 StrictHostKeyChecking no UserKnownHostsFile /dev/null

注意StrictHostKeyChecking noUserKnownHostsFile /dev/null:它们禁用主机密钥验证,避免首次连接时弹窗阻塞自动化。生产环境慎用,但开发调试阶段可接受。

第二层:VS Code 的 Remote-SSH 插件设置
打开 VS Code 设置(Ctrl+,)→ 搜索remote.ssh→ 关键设置:

  • Remote.SSH: Config File:指向你的~/.ssh/config
  • Remote.SSH: Use Local Server:设为true,让 VS Code 复用本地 SSH agent,避免重复输密;
  • Remote.SSH: Show Login Terminal:设为true,连接失败时自动弹出终端显示详细错误。

第三层:ssh-agent的生命周期管理
VS Code 默认不启动ssh-agent。需在 VS Code 启动前注入:

# 在 ~/.bashrc 中添加 if [ -z "$SSH_AUTH_SOCK" ]; then eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519_vps fi

然后重启 VS Code 或在集成终端中执行source ~/.bashrcssh-add -l应显示密钥。

第四层:Windows WSL2 的特殊适配
若你在 Windows 10 的 WSL2 中运行 Ubuntu 18.04,并从 Windows 端 VS Code 连接,需额外步骤:

  1. 在 Windows PowerShell 中运行Get-Service sshd | Set-Service -StartupType 'Manual'(确保 Windows OpenSSH 服务不冲突);
  2. 在 WSL2 中sudo service ssh start
  3. 修改 WSL2 的/etc/wsl.conf
[interop] enabled = true appendWindowsPath = false [network] generateHosts = true generateResolvConf = true
  1. 重启 WSL2:wsl --shutdown→ 重新打开。

当 VS Code 报ssh: connect to host ... network is unreachable时,90% 是第四层问题:WSL2 的网络地址未正确映射,或 Windows 防火墙阻止了 WSL2 的 22 端口。此时应先在 WSL2 终端中ssh -p 22 ubuntu@localhost测试本地连接,成功后再排查 VS Code 配置。

4. 实操过程:从零开始,手把手完成 Ubuntu 18.04 SSH 密钥全流程

4.1 客户端密钥生成与管理(以 Ubuntu 18.04 WSL2 为例)

假设你正在 Windows 10 上使用 WSL2,已安装 Ubuntu 18.04 发行版。打开 WSL2 终端,执行以下步骤:

步骤 1:更新系统并安装必要工具

sudo apt update && sudo apt upgrade -y sudo apt install -y openssh-client curl wget gnupg2

Ubuntu 18.04 默认已装openssh-client,但升级可确保ssh-keygen为最新版(7.6p1)。

步骤 2:生成 ed25519 密钥对

mkdir -p ~/.ssh chmod 700 ~/.ssh ssh-keygen -t ed25519 -C "alice-wsl2@work" -f ~/.ssh/id_ed25519_wsl2 -N "MyS3cur3P@ssw0rd!"

解释:

  • -t ed25519:指定算法;
  • -C "alice-wsl2@work":注释,便于识别;
  • -f ~/.ssh/id_ed25519_wsl2:私钥文件名,明确区分用途;
  • -N "MyS3cur3P@ssw0rd!":私钥密码,强度达标。

执行后,终端输出:

Your identification has been saved in /home/alice/.ssh/id_ed25519_wsl2. Your public key has been saved in /home/alice/.ssh/id_ed25519_wsl2.pub. The key fingerprint is: SHA256:AbCdEfGhIjKlMnOpQrStUvWxYz1234567890 alice-wsl2@work The key's randomart image is: +--[ED25519 256]--+ | .o. | | o .o | | . o.. | | . o.o. | | S o.o+ | | o o=+o | | . =o* | | o+=o | | o++ | +----[SHA256]-----+

步骤 3:启动并加载 ssh-agent

eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519_wsl2

ssh-add -l应返回:

256 SHA256:AbCdEfGhIjKlMnOpQrStUvWxYz1234567890 alice-wsl2@work (ED25519)

步骤 4:配置 SSH 客户端别名
编辑~/.ssh/config

nano ~/.ssh/config

填入:

Host my-server HostName 123.45.67.89 User ubuntu IdentityFile ~/.ssh/id_ed25519_wsl2 IdentitiesOnly yes ServerAliveInterval 60 ServerAliveCountMax 3
  • IdentitiesOnly yes:强制只用指定密钥,不尝试其他密钥;
  • ServerAliveInterval 60:每 60 秒发一次保活包,防ssh connection reset by peer
  • ServerAliveCountMax 3:连续 3 次保活失败后断开,避免僵尸连接。

保存后chmod 600 ~/.ssh/config

步骤 5:测试客户端配置

ssh -T my-server

若首次连接,会提示Are you sure you want to continue connecting (yes/no)?,输入yes。成功则显示Welcome to Ubuntu 18.04.6 LTS...

4.2 服务端配置与密钥分发(Ubuntu 18.04 云服务器)

登录你的 Ubuntu 18.04 云服务器(如腾讯云 CVM),假设用户名为ubuntu

步骤 1:检查并启用 PubkeyAuthentication

sudo grep -i "pubkeyauthentication" /etc/ssh/sshd_config

若输出为#PubkeyAuthentication yesPubkeyAuthentication no,则编辑:

sudo nano /etc/ssh/sshd_config

取消注释并设为:

PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys StrictModes yes

步骤 2:重启 SSH 服务

sudo sshd -t # 语法检查,无输出即成功 sudo systemctl reload sshd

注意:用reload而非restart,避免断开当前 SSH 连接。

步骤 3:从客户端分发公钥
回到 WSL2 终端,执行:

ssh-copy-id -i ~/.ssh/id_ed25519_wsl2.pub my-server

若提示ssh-copy-id: ERROR: No identities found,说明ssh-agent未加载该密钥,先ssh-add ~/.ssh/id_ed25519_wsl2

步骤 4:验证服务端公钥文件
登录服务器,检查:

ls -la ~/.ssh/ cat ~/.ssh/authorized_keys

应看到类似:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... alice-wsl2@work

且权限为:

drwx------ 2 ubuntu ubuntu 4096 Jun 10 10:00 .ssh/ -rw------- 1 ubuntu ubuntu 404 Jun 10 10:00 authorized_keys

步骤 5:禁用密码登录(可选,生产环境推荐)
确认密钥登录稳定后:

sudo nano /etc/ssh/sshd_config

设:

PasswordAuthentication no

sudo systemctl reload sshd,然后新开终端验证:

ssh my-server # 应无需输密码 ssh -o PubkeyAuthentication=no my-server # 应报 Permission denied (publickey)

4.3 VS Code Remote-SSH 连接实战与故障排除

步骤 1:安装插件并配置
在 VS Code 中安装 “Remote-SSH” 插件(Microsoft 官方)。按Ctrl+Shift+PRemote-SSH: Connect to Host...→ 选择my-server

步骤 2:首次连接日志分析
VS Code 底部状态栏会显示连接进度。若失败,点击Remote Explorer视图 →SSH Targets→ 右键my-serverShow Log。典型日志片段:

[10:15:22.123] Running script with connection command: "ssh" -T -D 42025 "my-server" bash [10:15:22.125] Terminal shell path: bash [10:15:22.456] Got some output stderr: "debug1: Next authentication method: publickey" [10:15:22.457] Got some output stderr: "debug1: Offering public key: /home/alice/.ssh/id_ed25519_wsl2 ED25519 SHA256:..." [10:15:22.458] Got some output stderr: "debug1: Server accepts key: /home/alice/.ssh/id_ed25519_wsl2 ED25519 SHA256:..." [10:15:22.459] Got some output stderr: "debug1: Authentication succeeded (publickey)."

若卡在Offering public key后无Authentication succeeded,说明服务端未加载密钥。

步骤 3:解决ssh: connect to host ... network is unreachable
此错误在 VS Code 中高频出现,但极少是网络问题。按顺序排查:

  1. 在 VS Code 集成终端中执行ssh my-server,若成功,则 VS Code 插件配置错误;
  2. ssh my-server也失败,检查~/.ssh/configHostName是否为域名(如myserver.example.com),DNS 解析失败会导致此错。改用 IP 地址测试;
  3. 检查ssh -vT my-server日志,看是否卡在debug1: Connecting to ... port 22.—— 若是,用telnet 123.45.67.89 22测试端口连通性;
  4. telnet通,但ssh不通,大概率是sshd未监听0.0.0.0:22。检查sudo ss -tlnp | grep :22,应有*:220.0.0.0:22;若只有127.0.0.1:22,则编辑sshd_config
ListenAddress 0.0.0.0:22

sudo systemctl reload sshd

步骤 4:Git 配置 SSH 密钥并推送测试
在 VS Code 中打开一个 Git 仓库,终端执行:

git remote set-url origin git@github.com:username/repo.git git push -u origin main

若首次推送,GitHub 会要求你确认The authenticity of host 'github.com (140.82.121.4)' can't be established.,输入yes。成功则显示To github.com:username/repo.git

5. 常见问题与排查技巧实录:那些年我们踩过的 Ubuntu 18.04 密钥坑

5.1 典型问题速查表

问题现象根本原因快速诊断命令解决方案
Permission denied (publickey)服务端~/.ssh/authorized_keys权限 >600ls -l ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys
ssh: connect to host ... port 22: Connection refusedsshd未运行或监听地址错误sudo systemctl status sshd
sudo ss -tlnp | grep :22
sudo systemctl start sshd
sudo nano /etc/ssh/sshd_configListenAddress 0.0.0.0:22
Warning: the ECDSA host key for 'host' differs from the key for the IP address主机重装系统,known_hosts中旧