SSH免密登录配置

在日常运维或开发工作中,频繁通过SSH登录多台Linux服务器时,反复输入IP、用户名和密码会极大降低效率。本文将详细介绍SSH免密登录的完整配置流程,以及多服务器别名优化方案,适配主流Linux发行版(包括Ubuntu、CentOS、Debian等),帮助大家实现“一键登录”,提升操作便捷性,同时兼顾安全性。

一、前置准备

在开始配置前,请确认以下条件已满足,避免后续踩坑:

  • 本地客户端:需为Linux、macOS或Windows Subsystem for Linux(WSL),自带SSH客户端(大部分系统默认预装);

  • 目标服务器:主流Linux发行版(Ubuntu、CentOS、Debian等),已安装并启动openssh-server(不同发行版安装命令略有差异:Ubuntu/Debian执行sudo apt install openssh\-server,CentOS执行sudo yum install openssh\-server;启动命令通用:sudo systemctl start sshsudo systemctl start sshd);

  • 基础信息:掌握每台服务器的「用户名」「IP地址/域名」「登录密码」,若服务器修改过SSH端口,需记录对应端口号。

二、单服务器SSH免密登录配置(基础步骤)

SSH免密登录的核心原理是「密钥对验证」:本地生成一对密钥(私钥+公钥),将公钥上传至服务器,后续登录时,服务器通过公钥验证本地私钥的合法性,无需输入密码即可完成登录。该流程适用于所有支持SSH的Linux发行版,操作一致。

2.1 本地客户端生成密钥对

推荐使用ed25519算法生成密钥(比传统RSA算法更安全、高效),操作如下:

1
2
# 生成ed25519密钥对,一路回车即可(无需设置passphrase,留空才是真正免密)
ssh-keygen -t ed25519

执行完成后,密钥对会默认保存到本地\~/\.ssh/目录下:

  • 私钥:\~/\.ssh/id\_ed25519(核心文件,请勿泄露、删除或修改权限);

  • 公钥:\~/\.ssh/id\_ed25519\.pub(需上传至目标服务器)。

注意:若提示“ssh-keygen: command not found”,说明本地未安装SSH客户端,Linux/macOS可通过系统包管理器安装(Ubuntu/Debian执行sudo apt install openssh\-client,CentOS执行sudo yum install openssh\-clients)。

2.2 将公钥上传至Linux服务器

提供两种上传方法,优先推荐自动上传法(一键搞定,避免手动配置权限出错),自动失败时再用手动上传法,适用于所有Linux发行版。

方法A:自动上传(推荐)

使用ssh\-copy\-id命令,自动将本地公钥上传至服务器,并完成\.ssh目录、authorized\_keys文件的创建和权限配置:

1
2
3
4
5
# 格式:ssh-copy-id 服务器用户名@服务器IP
# 示例:服务器用户为ubuntu(Ubuntu系统)或root(CentOS系统),IP为192.168.1.100
ssh-copy-id ubuntu@192.168.1.100
# 或
ssh-copy-id root@192.168.1.100

执行后,输入一次服务器登录密码,系统会自动完成后续操作,无需额外干预。

方法B:手动上传(自动失败时使用)

若服务器禁用了ssh\-copy\-id相关功能,可通过以下两步手动上传公钥,重点注意权限配置(SSH对权限要求极严格,权限错误会导致免密失败),操作适用于所有Linux发行版:

1
2
3
4
5
# 第一步:登录服务器,创建.ssh目录并设置权限(700,仅当前用户可读写执行)
ssh 服务器用户名@服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh"

# 第二步:将本地公钥追加到服务器的authorized_keys文件,并设置权限(600,仅当前用户可读写)
cat ~/.ssh/id_ed25519.pub | ssh 服务器用户名@服务器IP "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

执行过程中需输入一次服务器密码,完成后公钥即上传成功。

2.3 测试免密登录

上传公钥后,在本地终端执行以下命令,若无需输入密码直接进入服务器终端,说明免密登录配置成功,该操作适用于所有Linux发行版:

1
2
3
4
# 格式:ssh 服务器用户名@服务器IP
ssh ubuntu@192.168.1.100
# 或
ssh root@192.168.1.100

2.4 常见问题:免密登录失败(权限问题)

SSH免密登录失败,80%以上是权限配置错误导致,服务器端需保证以下权限(若失败,在服务器上执行修复命令),适用于所有Linux发行版:

  • 服务器\~/\.ssh目录权限:必须为700(chmod 700 \~/\.ssh);

  • 服务器\~/\.ssh/authorized\_keys文件权限:必须为600(chmod 600 \~/\.ssh/authorized\_keys);

  • 服务器用户家目录(\~)权限:不能过于宽松(默认权限一般为755,无需修改)。

2.5 可选优化:禁用密码登录(提升安全性)

若确认免密登录稳定可用,可禁用服务器的密码登录功能,避免暴力破解风险,操作如下(谨慎操作,若密钥丢失会无法登录),适用于所有Linux发行版:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 编辑SSH配置文件(不同发行版路径一致)
sudo nano /etc/ssh/sshd_config

# 2. 找到并修改以下3项(若没有则添加)
PubkeyAuthentication yes # 启用公钥验证
PasswordAuthentication no # 关闭密码登录
ChallengeResponseAuthentication no # 关闭挑战响应验证

# 3. 重启SSH服务,使配置生效(不同发行版命令略有差异)
# Ubuntu/Debian
sudo systemctl restart ssh
# CentOS
sudo systemctl restart sshd

三、多服务器免密+别名一键登录配置(核心优化)

若需要管理多台Linux服务器(无论何种发行版),每次输入ssh 用户名@IP仍显繁琐。通过配置SSH别名,可实现“ssh 别名”一键登录,大幅提升效率,该配置仅在本地客户端操作,与服务器发行版无关。

3.1 前提:完成所有服务器的免密基础配置

先将本地公钥分发到每台需要管理的服务器(重复2.2步骤),示例如下(3台不同发行版服务器):

1
2
3
4
5
6
7
8
# 服务器1:Ubuntu系统,用户root,IP192.168.1.10
ssh-copy-id root@192.168.1.10

# 服务器2:CentOS系统,用户root,IP192.168.1.11
ssh-copy-id root@192.168.1.11

# 服务器3:Debian系统,用户debian,IP192.168.1.12
ssh-copy-id debian@192.168.1.12

3.2 编辑本地SSH配置文件,设置别名

本地SSH配置文件为\~/\.ssh/config(若不存在,直接创建即可),通过编辑该文件,为每台服务器设置别名和对应配置,与服务器发行版无关:

1
2
# 编辑配置文件(使用nano编辑器,新手友好)
nano ~/.ssh/config

粘贴以下模板,按自己的服务器信息修改(别名、IP、用户名、端口按需调整):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 全局配置(所有服务器生效,可选,推荐添加)
Host *
ServerAliveInterval 30 # 每30秒发送一次心跳,防止SSH空闲断开
ServerAliveCountMax 3 # 心跳失败3次后断开连接
StrictHostKeyChecking no # 自动信任主机指纹,避免首次登录提示确认

# 服务器1:别名s1(Ubuntu系统,可自定义,如web、db等)
Host s1
HostName 192.168.1.10 # 服务器IP/域名
User root # 服务器登录用户名
Port 22 # SSH端口(默认22,修改过则替换)
IdentityFile ~/.ssh/id_ed25519 # 本地私钥路径(默认无需修改)

# 服务器2:别名s2(CentOS系统)
Host s2
HostName 192.168.1.11
User root
Port 22
IdentityFile ~/.ssh/id_ed25519

# 服务器3:别名s3(Debian系统,不同用户名示例)
Host s3
HostName 192.168.1.12
User debian
Port 22
IdentityFile ~/.ssh/id_ed25519

保存退出:按Ctrl\+O,回车确认保存,再按Ctrl\+X退出编辑器。

3.3 配置文件权限修复

SSH配置文件config的权限也需严格控制,否则会导致配置失效,本地执行以下命令修复:

1
2
chmod 600 ~/.ssh/config  # 仅当前用户可读写
chmod 700 ~/.ssh # 仅当前用户可读写执行

3.4 一键登录使用方法

配置完成后,无需输入复杂的IP和用户名,直接输入别名即可免密登录对应服务器,无论服务器是何种Linux发行版:

1
2
3
4
5
6
7
8
# 登录服务器1(别名s1,Ubuntu系统)
ssh s1

# 登录服务器2(别名s2,CentOS系统)
ssh s2

# 登录服务器3(别名s3,Debian系统)
ssh s3

四、扩展配置(适配特殊场景)

4.1 自定义SSH端口的服务器配置

若部分服务器修改了SSH端口(如2222),只需在对应别名配置中修改Port参数即可,适用于所有Linux发行版:

1
2
3
4
5
6
# 服务器4:别名s4,SSH端口2222(任意Linux发行版)
Host s4
HostName 192.168.1.13
User root
Port 2222
IdentityFile ~/.ssh/id_ed25519

4.2 后续新增服务器

新增服务器时,无论其为哪种Linux发行版,无需重新生成密钥对,只需两步即可加入别名管理:

  1. 分发公钥:ssh\-copy\-id 服务器用户名@服务器IP(输入一次密码);

  2. 添加别名:编辑\~/\.ssh/config,新增一段Host配置,填写别名、IP、用户名等信息。

五、总结

本文详细介绍了SSH免密登录的完整流程,以及多服务器别名配置方法,适配所有主流Linux发行版(Ubuntu、CentOS、Debian等),核心要点如下:

  • 免密登录核心:本地生成ed25519密钥对,将公钥上传至服务器,严格控制权限,操作适用于所有支持SSH的Linux发行版;

  • 多服务器优化:通过\~/\.ssh/config配置别名,实现一键登录,配置仅在本地操作,与服务器发行版无关,大幅提升运维效率;

  • 安全性提升:配置完成后可禁用密码登录,避免暴力破解风险,不同发行版仅重启SSH服务命令略有差异。

配置完成后,后续登录多台不同发行版的Linux服务器只需输入简单别名,彻底摆脱重复输入IP、密码的繁琐操作,适合日常运维、开发调试等场景。