以前配置服务器时,我留下了启用 sshd、生成 RSA 密钥和修正私钥权限的命令。它们分别解决了几个小问题,却没有连成完整的登录流程。这篇把服务端和客户端分开整理,方便新机器配置,也方便旧机器出现认证问题时逐项检查。
下面的 HOST 是服务器地址,TARGET_USER 是已经存在的远程普通用户。示例按 Linux 客户端和 Linux 服务端编写,替换占位符后再执行;Windows 私钥权限需要按 Windows ACL 处理,不能照搬 chmod。
在被连接的机器上启用服务
我原来的 Arch Linux 命令是:
sudo pacman -S openssh
sudo systemctl enable sshd
sudo systemctl start sshd
systemctl status sshd --no-pagerUbuntu 的安装包与服务入口不同。按 Ubuntu OpenSSH 服务文档安装,并查看服务状态:
sudo apt update
sudo apt install openssh-server
sudo systemctl start ssh.service
systemctl status ssh.service --no-pager如果系统使用 socket 激活,还应查看 systemctl status ssh.socket --no-pager。排查时以实际安装的 unit 为准,不要把 Arch 的 sshd 名称套到所有发行版。
确认监听状态:
sudo ss -ltnp默认 SSH 端口为 TCP 22。服务启动成功以后,客户端仍然需要能经过主机防火墙和云安全组访问该端口;先从可信网络确认连通性,再继续部署密钥。
在发起连接的机器上生成密钥
先看是否已有可用密钥,避免在提示覆盖时误删旧文件:
ls -la ~/.ssh新建一把独立密钥时,可以显式选择文件名:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_server -C "server-login"交互过程中可以设置口令。生成的无后缀文件是私钥,.pub 文件是公钥;只把公钥部署到远端。文件名、密钥类型与注释选项的含义见 ssh-keygen 手册。这里的注释只是识别标签,不要求填写邮箱。
早期记录的 RSA 命令仍保留在这里:
ssh-keygen -t rsa -C "your-email@example.com"
chmod 600 ~/.ssh/id_rsa它使用默认文件名,已有 id_rsa 时不要覆盖。是否沿用旧密钥取决于目标设备支持情况,不必为了文章的新示例替换一把仍在使用的密钥。
部署公钥并验证
客户端装有 ssh-copy-id,且服务器仍允许密码登录时,可以运行:
ssh-copy-id -i ~/.ssh/id_ed25519_server.pub TARGET_USER@HOST这一步把公钥追加到远程用户的授权文件,不能把私钥文件作为输入。Ubuntu 的 公钥认证说明给出了这一部署方式。
无法使用 ssh-copy-id 时,通过服务器控制台,以目标用户身份创建目录和文件,再把本机 .pub 文件的一整行追加进去:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys不要用覆盖文件的方式丢掉已有公钥,也不要把这些命令误执行在 root 的家目录。authorized_keys 属于被登录的用户,格式和权限检查可查 sshd 授权文件说明。
回到客户端验证,明确指定这把密钥:
ssh -i ~/.ssh/id_ed25519_server -o IdentitiesOnly=yes TARGET_USER@HOST首次连接出现主机指纹时,通过服务器控制台核对对应主机公钥的指纹。例如服务器使用 Ed25519 主机密钥时:
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub客户端的 known_hosts 记录服务器身份,服务器的 authorized_keys 决定哪些用户公钥可登录,两者作用不同。遇到主机密钥变更提示,先确认是否重装或更换了服务器,不要直接关闭主机身份检查。
保存常用连接
在客户端 ~/.ssh/config 写一个连接别名:
Host my-server
HostName HOST
User TARGET_USER
Port 22
IdentityFile ~/.ssh/id_ed25519_server
IdentitiesOnly yes之后使用 ssh my-server。IdentityFile 和 IdentitiesOnly 的配合可以限定这条连接使用的密钥,具体行为见 OpenSSH 客户端配置手册。这份配置是补充示例,不代表旧记录里存在同名服务器。
失败时先区分连接与认证
客户端输出详细过程:
ssh -vvv -i ~/.ssh/id_ed25519_server -o IdentitiesOnly=yes TARGET_USER@HOSTConnection refused 先查监听地址、端口和服务状态;超时先查路径及防火墙;Permission denied (publickey) 则检查用户名、公钥是否部署到该用户、客户端实际提供了哪把密钥。-v 可以重复增加调试级别,见 ssh 调试选项。
服务端 Ubuntu 查看:
sudo journalctl -u ssh.service -b -n 100 --no-pagerArch Linux 把 unit 换成 sshd.service。权限错误还要检查目录和文件的所有者;只修改权限数字,不能修正把公钥放错用户目录的问题。
如果修改了 /etc/ssh/sshd_config,先运行语法检查:
sudo /usr/sbin/sshd -tsshd 的测试模式用于检查配置和主机密钥。检查成功后再按该系统的服务管理方式重载;保留当前会话,用另一个终端确认新登录正常以后,才考虑调整密码认证等策略。旧记录没有保存完整登录日志,因此这里给出的是验证方法,没有补写一次并不存在的实测结果。