公众号旧文
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 或云主机的人来说,后者其实更加重要。