适用范围

Ubuntu 18.04+/Debian 10+ 系统,覆盖客户端密钥生成+服务端默认公钥路径+服务端自定义公钥路径,每种路径均提供nano(可视化)、sed(命令行)两种配置方法,全程无密码登录,兼顾新手友好和高效操作。

核心前提

  1. 服务端已开启SSH服务(未安装执行apt update && apt install -y openssh-server);

  2. 客户端能通过密码登录服务端(ssh 用户名@服务端IP),用于初始配置;

  3. 操作全程使用普通用户/root用户均可(下文以root为例,普通用户替换为对应家目录即可)。


一、客户端生成SSH公钥私钥对

Windows/Linux/macOS所有客户端操作一致,生成的密钥对默认路径通用,客户端执行,无需登录服务端。

执行生成命令

## 生成RSA 4096位高强度密钥对,一路回车默认配置(无需设置passphrase)
ssh-keygen -t rsa -b 4096

密钥对默认路径(核心,后续需用到公钥)

Linux/macOS客户端

私钥 ~/.ssh/id_rsa、公钥 ~/.ssh/id_rsa.pub

Windows客户端

(PowerShell/终端):
 私钥  C:\Users\你的用户名\.ssh\id_rsa
 公钥 C:\Users\你的用户名\.ssh\id_rsa.pub

复制客户端公钥内容(后续服务端配置用)

## Linux/macOS客户端
cat ~/.ssh/id_rsa.pub  ## 全选输出的整行字符串复制(ssh-rsa开头,无换行)
## Windows客户端(PowerShell)
type C:\Users\$env:USERNAME\.ssh\id_rsa.pub  ## 全选复制输出内容

二、服务端配置:默认公钥路径

SSH默认认证文件为~/.ssh/authorized_keys,无需修改SSH核心配置,仅需将客户端公钥写入该文件并配置正确权限,最推荐的常规方案

前置操作(服务端执行)

确保服务端.ssh目录存在,后续命令无需重复创建:

mkdir -p ~/.ssh && chmod 700 ~/.ssh  ## 700权限为SSH强制要求

方法1:nano可视化配置(新手友好,零出错)

步骤1:创建/打开默认认证文件
nano ~/.ssh/authorized_keys  ## 不存在则自动创建,存在则打开
步骤2:粘贴客户端公钥

在nano空白界面,右键粘贴/按Ctrl+V客户端复制的公钥内容,确保:

  • 公钥为单独一行,无换行、无多余空格、无截断;

  • 开头为ssh-rsa,结尾为客户端主机名/邮箱(无需修改)。

步骤3:保存并退出nano
Ctrl+O  ## 保存(底部提示文件名,直接回车确认)
Ctrl+X  ## 退出编辑器
步骤4:配置认证文件强制权限(SSH核心要求)
chmod 600 ~/.ssh/authorized_keys  ## 仅属主可读写,其他用户无任何权限

方法2:sed命令行配置(高效,适合批量操作)

步骤1:直接写入客户端公钥到默认认证文件

替换【客户端公钥完整内容】为实际复制的字符串,保留双引号,服务端一键执行

## 首次配置用>(覆盖写入),多客户端追加用>>
echo "【客户端公钥完整内容】" > ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
示例(实际公钥,请勿直接使用)
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQ7zVvT7x5eXk7V8QJZ9fUf9kf2sVw8eQJZ9fUf9kf2sVw root@local-pc" > ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys

通用验证(服务端执行)

确认文件权限和公钥内容正确,无错误则继续:

ls -l ~/.ssh/  ## 正确输出:-rw------- 1 root root xxx authorized_keys
cat ~/.ssh/authorized_keys  ## 输出与客户端公钥完全一致

三、服务端配置:自定义公钥路径

不使用默认authorized_keys,指定自定义公钥文件(如~/.ssh/fxzd_keys),需修改SSH核心配置sshd_config,指定认证文件路径,适合个性化需求

前置操作(服务端执行)

  1. 将客户端公钥写入自定义公钥文件,并配置基础权限:

mkdir -p ~/.ssh && chmod 700 ~/.ssh  ## 确保目录存在且权限正确
## 写入客户端公钥到自定义文件,替换【客户端公钥完整内容】
echo "【客户端公钥完整内容】" > ~/.ssh/fxzd_keys && chmod 600 ~/.ssh/fxzd_keys
  1. 验证自定义文件:

cat ~/.ssh/fxzd_keys  ## 输出与客户端公钥一致,权限为-rw-------

方法1:nano可视化配置(新手友好,可直观检查配置)

步骤1:打开SSH核心配置文件
nano /etc/ssh/sshd_config  ## Ubuntu/Debian通用配置路径
步骤2:添加/修改自定义公钥路径配置
  1. Ctrl+W搜索AuthorizedKeysFile,若找到注释行(##AuthorizedKeysFile .ssh/authorized_keys),删除##并修改路径;若未找到,直接将光标移到文件末尾空白行

  2. 添加以下配置,写绝对路径(必选,相对路径会失效):

AuthorizedKeysFile /root/.ssh/fxzd_keys  ## root用户用/root,普通用户用/home/用户名
步骤3:确保密钥登录基础配置开启(无则添加,有则取消注释)

sshd_config中确认以下配置(与自定义路径配置同文件,可写在末尾):

PubkeyAuthentication yes  ## 开启公钥认证(核心,必须开启)
PermitRootLogin prohibit-password  ## 允许root密钥登录,禁止密码登录
PasswordAuthentication no  ## 关闭密码登录,提升安全性
步骤4:保存并退出nano
Ctrl+O  ## 保存配置,回车确认文件名
Ctrl+X  ## 退出编辑器

方法2:sed命令行配置(高效,无需手动编辑)

步骤1:一键修改SSH配置(添加自定义路径+开启密钥登录)

服务端直接执行,自动备份原配置+添加自定义路径+开启核心配置,无需手动操作:

## 1. 备份原配置(防止改错,可回滚)
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak_$(date +%Y%m%d)
## 2. 末尾添加自定义公钥绝对路径
sed -i '$a AuthorizedKeysFile /root/.ssh/fxzd_keys' /etc/ssh/sshd_config
## 3. 开启公钥认证+允许root密钥登录+关闭密码登录(取消注释+修改值)
sed -i 's/^##PubkeyAuthentication /PubkeyAuthentication /' /etc/ssh/sshd_config && sed -i 's/^PubkeyAuthentication .*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^##PermitRootLogin /PermitRootLogin /' /etc/ssh/sshd_config && sed -i 's/^PermitRootLogin .*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sed -i 's/^##PasswordAuthentication /PasswordAuthentication /' /etc/ssh/sshd_config && sed -i 's/^PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config

通用后续操作(两种方法均需执行,服务端)

步骤1:检查SSH配置语法(无输出=正确,有输出按提示修正)
sshd -t
步骤2:重启SSH服务(Ubuntu/Debian通用,服务名均为ssh)
## 重启服务使配置生效
systemctl restart ssh
## 设为开机自启(可选,服务器重启后不失效)
systemctl enable ssh
## 验证服务状态(确保active (running))
systemctl status ssh --no-pager
步骤3:放行SSH端口(Ubuntu/Debian原生ufw防火墙)
## 开放22端口(默认),若修改了SSH端口则替换为新端口
ufw allow 22/tcp && ufw reload
## 验证放行状态
ufw status

⚠️ 云服务器必做:在阿里云/腾讯云/华为云等控制台「安全组」添加入站规则,放行22/TCP端口(仅本地防火墙放行无效)。


四、最终验证:客户端免密登录(所有配置方案通用)

客户端执行,关闭原有SSH连接,重新执行登录命令,无需输入密码直接进入服务端终端即配置成功:

ssh 用户名@服务端IP  ## 示例:ssh root@192.168.1.100

首次登录提示处理

若提示Are you sure you want to continue connecting (yes/no)?,输入yes回车即可(客户端会保存服务端指纹,后续登录不再提示)。


五、关键补充:多客户端登录配置(所有方案通用)

若需要多台客户端免密登录同一台服务端,仅需追加公钥,无需重复修改SSH配置:

默认路径方案

## 服务端执行,用>>追加,不要用>(会覆盖原有公钥)
echo "新客户端公钥完整内容" >> ~/.ssh/authorized_keys

自定义路径方案

## 服务端执行,追加到自定义公钥文件
echo "新客户端公钥完整内容" >> ~/.ssh/fxzd_keys

✅ 追加后无需重启SSH服务,立即生效。


六、常见问题一键修复(服务端执行)

1. 提示Permission denied (publickey)(90%为权限问题)

## 一键修复.ssh目录和公钥文件权限(通用所有方案)
chown -R 用户名:用户名 ~/.ssh && chmod 700 ~/.ssh && chmod 600 ~/.ssh/xxx  ## xxx替换为authorized_keys/fxzd_keys

2. SSH服务重启失败/配置语法错误

## 恢复备份配置+重启服务
cp /etc/ssh/sshd_config.bak_* /etc/ssh/sshd_config && systemctl restart ssh

3. 客户端仍提示输入密码

## 服务端检查核心配置是否开启
grep -E 'PubkeyAuthentication|AuthorizedKeysFile' /etc/ssh/sshd_config
## 客户端指定私钥路径登录(若私钥非默认路径)
ssh -i 客户端私钥路径 用户名@服务端IP  ## 示例:ssh -i ~/.ssh/my_id_rsa root@192.168.1.100

核心总结

  1. 客户端通用:密钥生成命令ssh-keygen -t rsa -b 4096,公钥复制后供服务端使用,私钥本地保留切勿泄露;

  2. 默认路径核心:无需修改sshd_config,仅需authorized_keys文件+700/600权限,简单高效;

  3. 自定义路径核心:通过sshd_configAuthorizedKeysFile指定绝对路径,必须配合权限配置;

  4. 工具选择nano适合新手(可视化),sed适合高效操作(命令行批量配置);

  5. 权限铁律.ssh目录必须700,公钥认证文件(authorized_keys/自定义)必须600,属主为登录用户;

  6. 系统专属:Ubuntu/Debian的SSH服务名均为ssh,重启命令systemctl restart ssh,配置路径/etc/ssh/sshd_config通用。