命令一:last | grep root | head -n 10
作用 :查看 root 用户最近的登录记录(含历史与当前在线会话)。
| 命令部分 | 含义 |
|---|---|
last |
读取 /var/log/wtmp,列出所有登录/注销历史。 |
grep root |
筛选 root 用户的行。 |
head -n 10 |
只显示前 10 行,避免刷屏。 |
如何看懂输出字段:
text
用户名 终端 来源信息 登录时间 状态
root pts/0 <远程IP-1> Tue Aug 18 15:04 still logged in
root tty1 :0 Tue Aug 18 13:58 still logged in
root pts/0 :0.0 Tue Aug 18 13:58 - 14:19 (00:20)
...
-
第三列(来源):
-
若为 IP 地址 (如
<远程IP-1>),表示该会话来自远程 SSH 连接。 -
若为
:0或:0.0,表示来自本地图形界面(X Window),非网络远程。
-
-
状态列:
-
still logged in→ 当前仍在线的会话,这是判断"当前谁在登录"的关键。 -
若显示如
(00:20),表示该会话已注销,持续了 20 分钟。
-
通过 last 可以直观看到哪些 IP 当前处于 still logged in 状态。
命令二:ss -tnp | grep :22 | grep -v LISTEN
作用:查看当前服务器上所有与 SSH(端口 22)相关的、已建立或正在发起的 TCP 连接,并显示进程信息。
| 命令部分 | 含义 |
|---|---|
ss |
Socket Statistics,查看套接字信息。 |
-t |
仅 TCP。 |
-n |
数字显示 IP 和端口(不解析域名)。 |
-p |
显示进程 PID 和程序名。 |
grep :22 |
只保留包含 :22 的行。 |
grep -v LISTEN |
去掉处于监听状态的守护进程,只保留实际通信连接。 |
如何看懂输出字段:
text
状态 recv-q send-q 本地地址:端口 远程地址:端口 进程信息
ESTAB 0 0 <服务器本地IP>:22 <远程IP-1>:37742 users:(("sshd",pid=30794,...))
SYN-SENT 0 1 <服务器本地IP>:56810 <远程IP-2>:22 users:(("ssh",pid=30875,...))
ESTAB 0 0 <服务器本地IP>:22 <远程IP-3>:4663 users:(("sshd",pid=30420,...))
-
状态:
-
ESTAB:连接已建立,正在通信。这些是当前有效的 SSH 会话(别人连你的)。 -
SYN-SENT:表示本机正在主动向外发起 SSH 连接(你的服务器作为客户端去连别的机器),不是别人连你。
-
-
本地地址:本机的网卡 IP 和端口(22 是 SSH 服务端端口)。
-
远程地址:连接对端的 IP 和临时端口。
-
进程信息:
-
sshd表示服务端进程(被连接),通常是root用户在远程登录。 -
ssh表示客户端进程(主动连接外部)。
-
两条命令的互补关系
-
last侧重于"登录历史与当前在线状态",能区分本地(图形/串口)和远程(IP)。 -
ss侧重于"实时网络连接",能精确显示当前所有 TCP 隧道,包括别人连你的和你连别人的。
结合输出分析:
-
last中显示有still logged in的pts/0行带有<远程IP-1>,说明当前有一个远程 SSH 登录。 -
ss中显示有两条ESTAB连接,远程地址分别为<远程IP-1>和<远程IP-3>,都连接到本机的 22 端口,说明有两个远程 IP 正在通过 SSH 连接本机。 -
另外还有一条
SYN-SENT,说明本机曾尝试连接<远程IP-2>的 22 端口(可能是之前在终端执行过ssh命令)。
因此,当前共有 2 个远程 IP 通过 SSH 以 root 身份登录(对应 pts/0 和另一个 pts 会话)。本地终端(tty1、ttyAMA0)不计入远程 IP。