who am i最轻量,输出如user1 pts/0 2026-07-09 04:22 (192.168.1.105),括号内即客户端ip;加--ips强制显示ip,若不支持则用echo $ssh_client | awk '{print $1}'。

直接看当前登录用户的IP:用 who 或 who am i
最轻量、最常用的方式,适合你刚登录进来想立刻知道「自己是从哪连进来的」。
执行 who am i,输出类似:
user1 pts/0 2026-07-09 04:22 (192.168.1.105)
括号里的就是你的客户端IP。注意:who 默认会做反向DNS解析,可能显示主机名而非IP;加 --ips 参数可强制只输出IP:
-
who am i --ips→ 输出user1 pts/0 2026-07-09 04:22 (192.168.1.105) - 若提示不支持
--ips(如旧版coreutils),改用echo $SSH_CLIENT | awk '{print $1}'更可靠
⚠️ 坑点:$SSH_CLIENT 只在首次SSH登录的shell里存在;如果你用 sudo su 或 screen / tmux 启动新子shell,这个变量就丢了。
查所有活跃SSH连接的IP:用 netstat 或 ss
当你需要看清「此刻有多少人连着、分别来自哪」,尤其排查异常连接时,得看网络连接层。
推荐用更现代的 ss(替代 netstat):
ss -tnp state established '( dport = :22 or sport = :22 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
说明:
-
-t:TCP连接;-n:不解析端口名(避免DNS延迟);-p:需root权限才显示进程名 -
state established过滤已建立连接(排除SYN_SENT等中间状态) -
dport = :22 or sport = :22覆盖「你连别人」和「别人连你」两种方向 - 最后三步是提取IP、去重、倒序统计——输出形如
3 10.160.129.218
如果没装 ss 或权限受限,用兼容性更强的 netstat -tn | grep ':22.*ESTABLISHED',但注意它不显示进程,且在较新系统中已被废弃。
查历史登录IP:用 last 和 lastlog
当连接已断开,但你想回溯「谁、什么时候、从哪连过」,就得翻日志。
last 读取 /var/log/wtmp,显示最近成功登录记录:
-
last -n 20→ 查最近20条登录(含IP或主机名) -
last -i→ 强制显示IP(绕过DNS反解) - 注意:
wtmp会被轮转,重启或日志清理后旧记录可能消失
lastlog 按用户维度展示「每个用户最后一次登录的IP和时间」:
-
lastlog -u username→ 看指定用户 -
lastlog | grep -v '**Never**'→ 排除从未登录过的账号
⚠️ 坑点:这些命令依赖系统日志机制,若攻击者清空了 wtmp 或禁用了 lastlog 记录,结果就不全;关键场景建议配合 ausearch -m avc -ts today | grep sshd 查audit日志。
为什么 $SSH_CONNECTION 有时比 $SSH_CLIENT 更准?
$SSH_CLIENT 是空格分隔的三元组:client_ip client_port server_port;而 $SSH_CONNECTION 是四元组:client_ip client_port server_ip server_port。
区别在于:$SSH_CONNECTION 明确记录了「服务端监听的IP」,这对多网卡服务器很重要——比如你绑定了 192.168.1.100 和 10.0.0.50 两个IP,用户连的是哪个,$SSH_CONNECTION 第三项能告诉你。
实操建议:
- 优先用
echo $SSH_CONNECTION | awk '{print $1}'提取客户端IP - 若为空,再 fallback 到
echo $SSH_CLIENT | awk '{print $1}' - 写脚本时别硬编码
$SSH_CLIENT,加一层判断更稳
真正容易被忽略的是:这些环境变量只存在于 SSH 启动的初始 shell 中。一旦你执行 su -、sudo -i 或进入 screen 会话,父进程的环境就断开了——这时候必须回到 ss 或 last 才能找回IP线索。











