◆

SSH 配置别名快捷免密登录服务器

2024-05-20 07:140

管几台服务器之后,每次登录都要敲一长串 ssh -p 2222 root@124.0.88.88 再输密码,IP 记不住只能翻文档。SSH 自带的 config 文件能把这些都省掉:给每台机器起个别名,之后 ssh me 就进去了。

配合密钥认证还能免密码。这不只是省事——密码认证会被暴力破解,公网上的服务器每天都在被扫,配好密钥之后可以直接关掉密码登录,安全性提升是实质性的。

快捷登录

进入到 ssh 目录下

cd ~/.ssh

编辑 config 文件,没有则创建

vi config

~/.ssh/config 是 SSH 客户端的用户级配置,ssh 命令每次执行都会读它。文件不存在就自己创建,不需要任何初始化。

文件内容如下

# 把SSH连接设置保存在一个配置文件中,比如 ~/.ssh/config
# 添加一个SSH连接的条目,类似于以下内容:
Host me
HostName 124.0.88.88
User root
Port 22
IdentityFile ~/.ssh/id_rsa
Host other
HostName 124.0.88.99
User root
Port 22
IdentityFile ~/.ssh/id_rsa

如上配置成自己需要登录的服务器信息

四个字段各自的含义:Host 是你自己起的别名,随便取;HostName 是真实的 IP 或域名;User 是登录用户名;Port 是端口,默认 22 可以不写;IdentityFile 指定用哪个私钥。

习惯上 Host 下面的配置项要缩进,虽然不缩进也能正常解析。缩进的好处是一眼能看出哪些配置属于哪个 Host,多台机器时可读性差别很大。

还有几个常用配置值得加上:

Host prod
    HostName 124.0.88.88
    User root
    Port 22
    IdentityFile ~/.ssh/id_rsa
    ServerAliveInterval 60      # 每 60 秒发个心跳,防止长时间空闲被断开
    ServerAliveCountMax 3       # 连续 3 次没响应才认定断线

Host *                          # 通配,对所有主机生效
    AddKeysToAgent yes          # 自动把用过的密钥加进 ssh-agent

ServerAliveInterval 解决的是「挂着终端去开会,回来发现连接死了」这个问题——中间的 NAT 设备会清理空闲连接,定期发心跳能保住它。

输入对应的 Host 别名即可链接服务器

ssh me
ssh other

别名不只 ssh 能用,scp、rsync、git 走 SSH 时都认。scp file me:/tmp/ 直接就能传文件,不用再写完整的用户名和 IP。

免密登录

免密的原理是非对称加密:私钥留在本机,公钥放到服务器上。登录时服务器用公钥出一道只有对应私钥能解的题,客户端解开证明身份,全程密码不上网。

首先要生成 ssh 密钥

ssh-keygen

一路回车用默认值即可。中间会问「Enter passphrase」——这是给私钥本身加的密码,加了之后即使私钥文件被人拿走也用不了。配合 ssh-agent 使用时只需在开机后输一次,之后自动记住,不影响日常体验,建议加上。

密钥类型现在推荐用 ed25519 而不是默认的 RSA,密钥更短、速度更快、安全性更好:

ssh-keygen -t ed25519 -C "your@email.com"

-C 是注释,写邮箱方便日后辨认这个密钥是哪台机器的。用 ed25519 生成的文件名是 id_ed25519 和 id_ed25519.pub,config 里的 IdentityFile 要跟着改。

生成好后会在 ~/.ssh 中看到,如下两个文件

  • id_rsa (私钥)
  • id_rsa.pub (公钥)

只有 .pub 结尾的公钥可以给别人,私钥永远不能外传。这是最基本的原则,但确实见过有人把私钥贴到群里问问题。

执行以下命令,将公钥复制到所需要免密登录的服务器中,再次登录即可实现免密登录

ssh-copy-id 做的事情是:登录到目标服务器(这一次还要输密码),把公钥内容追加到服务器上的 ~/.ssh/authorized_keys 文件里,并且顺手把目录和文件的权限设对。手工 cat 追加也能实现,但权限容易设错,用这个命令省事:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.88.99

配好 config 之后可以直接用别名:ssh-copy-id me。

免密不生效时怎么查

这是最常见的问题,按下面的顺序排查基本都能找到原因。

权限问题最常见。SSH 对权限极其严格,权限太宽松它会直接拒绝使用密钥(因为其他用户可读的私钥不安全),而且默认不给明确提示。正确的权限是:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys   # 服务器上这个也要对

服务器上的家目录权限也算在内,如果 /root 或 /home/user 是 777,SSH 同样拒绝。

用 -v 看具体过程。ssh -v me 会打印认证的每一步,能看到它尝试了哪些密钥、服务器接受了没有。想更详细用 -vvv。输出里找 Offering public key 和后面服务器的反应,问题基本就定位了。

确认服务端允许密钥认证。服务器的 /etc/ssh/sshd_config 里 PubkeyAuthentication 要是 yes。如果用 root 登录,还要看 PermitRootLogin 的值——设成 prohibit-password 时密钥可以但密码不行,设成 no 则完全禁止 root 登录。改完这个文件要 systemctl restart sshd 才生效。

免密验证通过之后,可以考虑把服务器的密码登录关掉(PasswordAuthentication no)。但改之前一定要确认密钥登录确实能用,并且最好留一个已连接的会话不要断开——万一配错了,还有机会改回来,否则就只能去用服务商的控制台救了。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVESSH 配置别名快捷免密登录服务器加载中