公众号旧文

SSH 使用时需要注意什么?

作者:胖子阅读 —

#这些常见问题最好提前知道

上一篇文章介绍了 SSH 的基本使用方法,包括如何登录服务器、指定端口、使用密钥等。

真正开始使用 SSH 后,还会遇到一些比较具体的问题。

比如:

服务器没有给我 IP,只有一个主机名怎么办?

SSH 端口不是 22 怎么办?

为什么别人能登录,我这里却提示连接超时?

第一次连接服务器时出现一大段英文,要不要输入 yes?

这篇就集中讲一下 SSH 使用过程中比较常见的注意事项。

1. 没有 IP,只有主机名怎么办?

SSH 并不要求一定使用 IP 地址。

如果服务器提供的是主机名,例如:

server.example.com

直接使用主机名连接即可:

ssh root@server.example.com

它和:

ssh root@192.168.1.100

本质上没有太大区别。

SSH 在建立连接之前,会先通过 DNS 将:

server.example.com

解析成对应的 IP 地址,然后再连接服务器。

可以先测试一下主机名能不能正常解析:

ping server.example.com

或者:

nslookup server.example.com

Linux 还可以使用:

dig server.example.com

如果能够查到 IP,通常就可以继续使用 SSH。

不过需要注意,有些主机名并不是公网 DNS 域名,而是局域网内部主机名,例如:

nas

server01

debian-vm

这类名称只有在你的电脑能够正确解析它时才能使用。

例如:

ssh root@server01

如果出现:

Could not resolve hostname

通常说明 SSH 根本没有找到这台机器,而不是账号或者密码错误。

这时候需要检查 DNS、Hosts 文件、局域网 DNS,或者直接询问管理员这个主机名对应的 IP 地址。


2. SSH 默认使用 22 端口,但服务器不一定使用 22

SSH 默认端口是:

22

因此:

ssh root@192.168.1.100

实际上相当于:

ssh -p 22 root@192.168.1.100

但很多服务器为了管理方便,会修改 SSH 端口。

例如 SSH 端口是:

2222

连接时就要写:

ssh -p 2222 root@192.168.1.100

使用主机名也是一样:

ssh -p 2222 root@server.example.com

这里一个很容易写错的地方是:

SSH 指定端口使用的是小写-p。

ssh -p 2222 user@host

不要和其他命令的参数混淆。


3. 用户名不能省略得太随意

常见 SSH 登录命令是:

ssh root@192.168.1.100

这里的:

root

就是远程服务器用户名。

如果服务器要求使用:

ubuntu

那么就应该:

ssh ubuntu@192.168.1.100

有些云服务器默认甚至不允许直接使用 root 登录。

例如不同系统可能使用:

ubuntu

debian

ec2-user

centos

admin

如果用户名写错,经常会看到:

Permission denied

所以拿到服务器之后,除了 IP 地址之外,至少还应该确认三个信息:

主机地址、SSH 端口、登录用户名。


4. 第一次连接为什么会提示 yes/no?

第一次连接一台服务器时,经常会看到类似提示:

The authenticity of host '192.168.1.100' can't be established.

Are you sure you want to continue connecting (yes/no/[fingerprint])?

这是正常现象。

SSH 在询问:

这台服务器以前没有连接过,你是否信任它?

确认服务器地址没有问题后,可以输入:

yes

SSH 会将服务器的主机密钥保存到本地。

Linux、macOS 一般保存在:

~/.ssh/known_hosts

Windows OpenSSH 通常也是:

C:\Users\用户名\.ssh\known_hosts

以后再次连接时,SSH 会检查服务器身份是否发生变化。


5. 出现 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 不要直接无脑删除

有时候会出现:

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

意思是:

你现在连接到的服务器密钥,和以前记录的不一样。

这种情况可能只是服务器重装了系统,也可能是 IP 被分配给了另一台服务器。

但理论上也存在中间人攻击的可能。

所以不要看到报错就直接删除记录。

应该先确认:

  • 服务器是不是刚刚重装过;
  • IP 是否更换过服务器;
  • SSH Host Key 是否确实发生了变化。

确认安全后,可以删除旧记录:

ssh-keygen -R 192.168.1.100

如果使用的是主机名:

ssh-keygen -R server.example.com

然后重新连接。


6. 连接超时和密码错误是两回事

SSH 常见错误最好学会区分。

如果出现:

Connection timed out

一般说明连接还没有到 SSH 登录验证这一步。

可能是:

  • IP 地址错误;
  • SSH 端口错误;
  • 防火墙拦截;
  • 云服务器安全组没有放行;
  • 服务器 SSH 服务没有启动;
  • 网络路由存在问题。

如果出现:

Connection refused

通常表示目标机器可以访问,但是对应端口没有服务监听,或者被明确拒绝。

如果出现:

Permission denied

则通常说明已经连接到了 SSH 服务,但是:

  • 用户名错误;
  • 密码错误;
  • SSH Key 不正确;
  • 服务器禁止密码登录;
  • 服务器禁止 root 登录。

所以看到 SSH 报错后,不要第一反应就一直重新输入密码。

先看清楚到底是哪一种错误。


7. 能 ping 通,不代表 SSH 一定能连接

这是一个非常常见的误区。

例如:

ping 192.168.1.100

能够正常返回,并不能证明:

ssh root@192.168.1.100

就一定可以连接。

因为 Ping 使用的是 ICMP,而 SSH 一般使用 TCP 22 端口。

完全可能出现:

Ping 正常

SSH 不通

例如服务器防火墙只允许 ICMP,却没有开放 TCP 22。

因此排查 SSH 时,最好直接测试对应端口。

Windows PowerShell 可以使用:

Test-NetConnection 192.168.1.100 -Port 22

Linux 可以使用:

nc -vz 192.168.1.100 22

这样比单纯 Ping 更有参考价值。


8. 公网服务器尽量使用 SSH Key

如果服务器长期暴露在公网,不建议长期使用简单密码登录。

更推荐使用:

SSH 公钥认证

基本原理是:

本地电脑保存私钥:

Private Key

服务器保存公钥:

Public Key

登录时通过密钥完成身份认证。

尤其是云服务器、VPS、生产服务器,建议:

使用 SSH Key + 禁止弱密码 + 限制 root 登录。

同时一定不要把自己的私钥文件随便发送给别人。

id_rsa

id_ed25519

这类文件都属于私钥。

真正可以放到服务器上的一般是:

id_rsa.pub

id_ed25519.pub

也就是公钥。


9. 主机多了以后,建议使用 SSH Config

如果只有一两台服务器:

ssh root@192.168.1.100

问题不大。

但如果管理十几台服务器,每次都输入:

ssh -p 2222 root@server.example.com

就比较麻烦了。

可以编辑:

~/.ssh/config

例如:

Host myserver

    HostName server.example.com

    User root

    Port 2222

以后只需要:

ssh myserver

即可登录。

如果平时管理的服务器比较多,这个功能非常实用。


10. 主机名、域名和 IP,本质上最终还是要找到目标服务器

SSH 登录时可以使用很多形式:

ssh root@192.168.1.100

可以使用域名:

ssh root@server.example.com

也可以使用能够被系统解析的局域网主机名:

ssh root@server01

所以别人只给你主机名,并不代表缺少服务器地址。

真正重要的是:

你的电脑能不能把这个名字解析到正确的 IP。

如果出现:

Could not resolve hostname

先查名称解析。

如果出现:

Connection timed out

再查网络和端口。

如果出现:

Permission denied

再查用户名、密码和 SSH Key。

按照这个顺序排查,大多数 SSH 登录问题其实都不难定位。

写在最后

SSH 本身并不复杂,真正容易让人困惑的,往往不是 SSH 命令,而是它背后的几个基础概念:

主机名解析、IP 地址、端口、防火墙、用户认证和 SSH Key。

把这些关系弄清楚以后,再看到 SSH 报错,就不用靠不断重试碰运气了。

上一篇解决的是SSH 怎么登录,这一篇解决的则是SSH 登录失败以后应该怎么看问题。

对于经常接触 Linux、服务器、NAS、VPS 或云主机的人来说,后者其实更加重要。