拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux排查指南:看清登录会话、进程属主与网络端口

很多时候我们并不是真的关心系统上有几个用户而是在某个深夜被一条告警叫醒之后迫切想知道一个问题现在这台服务器上到底有谁他们在干什么他们到底是不是该出现的人这里说的“看到谁”并不是翻聊天记录而是 Linux 系统上最基础也最容易被忽略的三层排查谁登录了这台机器谁在这台机器上跑着进程谁正在通过端口和这台机器通信。很多人凭借whoami、ps -ef | grep xxx就能应付日常开发但真正面对“系统可能被人动过”“不知道是谁留下的进程”“凌晨负载突然被打满”这类问题时往往不知道从哪里下手。这篇文章想给出一个明确判断排查 Linux 系统上“都有谁”核心是把用户、进程、网络连接三个视角打通而不是死记命令。大部分场景不需要安装任何监控软件系统自带命令就能完成从发现、定位到判断的完整流程。读完这篇文章你能学会用一组命令快速回答“现在有谁登录、历史上有谁登录、谁在跑什么、谁在连我的端口”并且知道哪些现象说明有问题哪些事情在动手之前必须先想清楚。1. 这件事为什么会成为问题先看一个最常见的场景。凌晨两点监控告警某台线上服务器的 load average 冲到了 20。你第一反应是重启服务但更该做的判断是这个负载是自己人搞出来的还是有陌生账号登录后跑了挖矿程序如果没有“看得到谁”的能力你只能看着 top 里的未知进程干着急。再看另一个场景。项目组有人离职你把他的账号禁用了可一周后安全合规检查问这个账号上周三有没有登录过登录了几次从哪里来的如果你平时根本不记录这个问题就无法在五分钟内回答清楚。第三个场景更隐蔽。Nginx 访问日志里突然出现大量来自某个 IP 的请求你以为只是爬虫后来发现是有人在扫 SSH 端口。这个时候你需要回答的不是“谁在访问网页”而是“谁在尝试进入系统”。这三个场景指向同一个能力在任意时刻把系统上“正在出现的身份”和“已经发生的行为”快速还原出来。对开发者和运维来说这个能力不叫黑客技术而叫可观测性的基础。你不需要记住每条命令的每个参数但要记住三件事用户视角查登录会话回答“谁在/谁来过”。进程视角查进程属主与资源占用回答“谁在跑什么”。网络视角查连接与监听端口回答“谁在通过端口通信”。这篇文章适合三类读者刚入门 Linux 的开发新手需要值班排查线上问题的后端或 SRE以及想做基础主机安全审计、但不想上一整套商业产品的运维同学。下面的内容从概念开始逐步把这套方法讲透。2. 先搞清四个概念登录会话、进程属主、终端、日志在敲命令之前先把几个容易混淆的概念理清楚。登录会话Login Session用户通过 SSH、物理终端或图形登录界面进入系统后形成的一个会话。每个会话通常关联一个终端例如tty1表示物理终端pts/0表示 SSH 远程终端。who和w看到的就是这种会话。进程属主Process Owner一个进程运行时的 UNIX 用户。进程并不是“登录”出来的而是由某个用户身份启动的。通过ps看到的USER列就是进程的属主。这里的关键点是登录用户和进程属主并不一一对应。用户 A 登录后转头用sudo -u把某个任务交给了用户 B 的身份去跑那么w看到的是 Aps看到的是 B。终端TTY表现为tty、pts等形式。tty通常指物理终端或者虚拟终端pts指 SSH 或终端模拟器分配的伪终端。判断某个会话是本地登录还是远程登录主要就看终端类型和来源地址。登录日志wtmp / btmpLinux 通过wtmp记录成功登录的历史通过btmp记录失败的登录尝试。这两个文件是二进制格式不能用cat直接看要用last、lastb等命令解析。这三个概念之间的关系可以概括成一句话用户启动会话会话关联终端终端连接来自某个 IP用户又以某个身份运行进程进程最终会占用端口并建立网络连接。后面所有命令都是在这些关系上做切片。为方便对照把核心名词整理如下概念代表命令回答的问题登录会话who、w、users现在哪些用户登录了历史登录last、lastb谁成功/失败登录过进程属主ps、top、pstree谁在跑进程、占用多少资源网络连接ss、lsof、netstat谁在通过端口通信概念部分到这里就够了下面进入实操先从“现在有谁”开始。3. 环境准备先确认命令在不在这套排查方法几乎不需要安装任何软件。who、w来自 util-linux 包last、lastb来自 sysvinit 工具集ps来自 procps-ngss来自 iproute2这些都是常见发行版默认安装的组件。lsof和htop不一定默认存在需要时再安装即可。首先确认工具是否可用for cmd in who w last lastb ps ss lsof; do command -v $cmd || echo $cmd 未安装 done输出中如果出现“未安装”按发行版安装。以 Debian/Ubuntu 系为例sudo apt update sudo apt install -y lsofRHEL/CentOS 系使用yum install -y lsof或dnf install -y lsof。需要提醒两点查看自己的会话用普通用户即可但lastb读取 btmp 文件、ss -p查看进程信息、lsof -i查看端口进程通常需要 root 权限否则会显示权限不足或直接不显示进程列。不同发行版、不同版本的命令输出格式略有差异这不是错误。例如较新的ss会显示进程名老版本参数更少。本文以通用输出为准具体版本细节以你实际系统为准。4. 用户视角现在这台机器上都有谁4.1 who最直接的答案who是回答“现在有谁”的第一命令。不带参数执行who典型输出root tty1 2025-01-06 09:12 alice pts/0 2025-01-06 08:30 (192.168.1.100) bob pts/1 2025-01-06 10:05 (10.0.0.5)每行含义用户名、登录终端、登录时间、来源地址。括号里是来源地址如果显示(:0)或(tty1)说明来自本机图形界面或物理终端如果是 IP 则是远程登录。加-u可以看到空闲时间和会话 PIDwho -uHNAME LINE TIME IDLE PID COMMENT root tty1 2025-01-06 09:12 . 1234 alice pts/0 2025-01-06 08:30 05:11 2345 (192.168.1.100) bob pts/1 2025-01-06 10:05 12:35 3456 (10.0.0.5)IDLE列.表示当前处于活动状态具体的时间表示空闲了多久。这个字段在排查时很有用某个会话长时间空闲却在凌晨突然有进程在跑就需要重点怀疑。如果你只想确认自己是以什么身份、从哪里登录进来的用who am iwho am i这个命令不依赖环境变量即使你su切换过用户它也会显示出你最初登录时的真实身份排查权限归属时非常实用。4.2 w谁在并且正在干什么w可以理解为who的增强版。它在列出会话的同时还会显示每个会话当前的 CPU、内存占用和正在执行的命令w10:22:31 up 3 days, 2:15, 3 users, load average: 0.32, 0.41, 0.38 USER TTY FROM LOGIN IDLE JCPU PCPU WHAT root tty1 - 09:12 1:10m 0.25s 0.25s -bash alice pts/0 192.168.1.100 08:30 5:11 2.05s 0.02s python3 script.py bob pts/1 10.0.0.5 10:05 12:35 0.50s 0.05s top第一行是系统摘要当前时间、运行时长、在线用户数、1/5/15 分钟平均负载。这一行就足够回答“系统目前忙不忙”的问题。WHAT列显示的是用户当前正在执行的前台命令。如果某个用户显示的是-bash或-zsh说明他只是在维护一个空闲 shell如果显示的是python3 script.py、xmrig一类程序就要结合后面的来源 IP 来判断是否正常。日常巡检时w是信息密度最高的一条命令。它同时回答了在线人数、负载状况和每个用户当前动作三个问题。4.3 users一句话版本的在线列表如果你只想在脚本里拿到用户名列表用usersusers输出是单行按登录顺序排列alice bob root一个容易忽略的点同一个用户名可能同时登录多次比如 alice 通过 SSH 开了三个窗口就会在列表中重复出现。统计每个用户有几个会话可以这样组合who | awk {print $1} | sort | uniq -c这样会输出类似2 alice、1 bob、1 root的结果一眼看出哪个用户开的会话最多。会话数量异常增多有时也意味着账号被多人共用或凭据泄露。实际项目中推荐先w快速看整体再用who -uH确认会话 PID 和来源然后用ps深挖进程。下一节把时间轴拉长看看“过去都有谁”。5. 历史视角谁来过、谁没走成5.1 last成功的登录记录last读取/var/log/wtmp显示系统重启记录和每次成功登录的起止时间last -F输出alice pts/0 192.168.1.100 Mon Jan 6 08:30:28 2025 still logged in bob pts/1 10.0.0.5 Mon Jan 6 10:05:01 2025 still logged in root tty1 :0 Mon Jan 6 09:12:20 2025 still logged in reboot system boot 5.15.0-91-generic Mon Jan 6 07:00:03 2025 still running注意两点still logged in表示这个会话现在还在它和who的结果是对应的。如果某条记录有开始时间但当前没有对应会话说明会话已经结束这是正常现象。wtmp会轮转。last默认只读当前 wtmp 文件想看更早的记录可以按发行版的日志轮转规则读取/var/log/wtmp.1或者使用journalctl见下文。限制条数用-n也可以指定用户last -n 20 last -F -n 10 alice # 只查 alice 这个用户排查离职账号是否用过系统last username是效率最高的命令。它会列出该用户所有的登录记录配合来源 IP 基本能还原当时的访问路径。5.2 lastb失败的登录尝试如果怀疑有人在爆破 SSHlastb是最快的信息来源。它读取/var/log/btmp记录所有失败的登录尝试sudo lastb -n 20典型输出bob ssh:notty 203.0.113.9 Mon Jan 6 10:01:22 2025 - 10:01:22 2025 (00:00) root ssh:notty 198.51.100.7 Mon Jan 6 09:55:41 2025 - 09:55:41 2025 (00:00) alice ssh:notty 203.0.113.9 Mon Jan 6 10:02:55 2025 - 10:02:55 2025 (00:00)ssh:notty表示这些尝试来自 SSH 但没有分配终端通常说明连接没有建立成功属于认证阶段就失败了。大量来自陌生地址、不断尝试不同用户的失败记录基本可以判断有人在扫描或爆破。注意 btmp 文件默认可能不存在第一次执行lastb被拒绝时先确认文件是否已经创建。5.3 从系统日志复核last和lastb是二进制日志的快捷视图核对细节还要看文本日志。Debian/Ubuntu 的 SSH 登录日志在/var/log/auth.logRHEL/CentOS 在/var/log/secure使用 systemd 的发行版可以直接查看journalctl -u ssh --since today journalctl -u sshd --since 2025-01-06 08:00:00日志里会详细到每次认证的进程 PID、来源 IP、使用的认证方式。推荐的做法是先last、lastb缩小范围再用日志确认精确时间和来源。这里有一个值得记下的经验日志轮转会丢数据。如果 wtmp 在某个登录事件之后发生过轮转last看到的记录可能不完整。所以安全审计不能只依赖某一台主机的本地日志重要服务器建议把日志集中存储或接入审计系统。6. 进程视角谁在跑什么登录会话只是入口。真正消耗 CPU、内存、带宽的是进程。查“谁在跑”要回答两个问题进程是由哪个用户启动的它的父进程是谁。6.1 ps -ef 与 ps auxps -ef是 System V 风格的全格式ps aux是 BSD 风格格式两者本质都能查全量进程常用哪个都行ps -ef ps auxps aux的输出列含义USER是进程属主PID是进程号%CPU、%MEM是资源占比STAT是状态COMMAND是完整命令。一个非常实用的组合是查看系统 CPU 占用最高的 10 个进程ps -eo user,pid,ppid,%cpu,%mem,etime,cmd --sort-%cpu | head -n 11这段命令的含义按 CPU 占用倒序排列并显示用户、进程号、父进程号、CPU 占比、内存占比、进程运行时长、完整命令。head -n 11是因为第一行是表头。如果看到某个进程的USER是陌生用户CPU 占用长期接近 100%命令名又带有xmrig、minerd等挖矿特征就要立刻沿着 PID 查它的父进程和启动路径。用-o精确匹配ps -eo pid,ppid,user,cmd | grep -iE xmrig|minerd正常业务进程的名字和路径是可预期的而可疑进程往往会伪装成sysupdate、kthreadd之类的名字所以不要只看进程名要看完整命令路径和启动时间。6.2 按用户过滤如果w显示某个用户登录了想看他启动的所有进程ps -u alice -o pid,ppid,%cpu,%mem,etime,cmd --sort-%cpu也可以直接用pgrep列出匹配的进程pgrep -u alice -a这里要注意ps -u只显示属主为该用户的进程。如果用户通过sudo切换了身份进程属主会变成 root 或其他用户这条命令就看不全。排查时要配合下面的树状视图。6.3 用树状视图理清父子关系pstree能把进程的父子关系画成树防止被进程名误导。恶意程序经常会通过改名伪装自己但父进程关系很难彻底伪装。pstree -u alice输出示例括号中显示进程切换后的用户sshd(1100)───bash(1100)───su(1200)─┬─python3(1300) └─bash(1301)如果 alice 的会话下面挂着 root 权限的进程这个会话就需要重点审查。进程树的价值在于它暴露了“一个可疑进程是从哪里被拉起来的”。只看单个进程可能被名字欺骗但父子结构很难长期维持伪装。6.4 交互式查看看资源top进入交互界面后按u再输入用户名可以只显示某个用户的进程按P按 CPU 排序按M按内存排序。htop体验更好支持按 F5 查看进程树、按 F4 过滤但不是默认安装需要时再装。交互式工具适合人工观察脚本化巡检还是推荐ps的--sort参数输出稳定、方便重定向。一个行为判断准则正常服务的进程命令路径是已知且稳定的。出现以下迹象就值得警惕某个用户的 shell 下方挂着大量异常子进程。命令路径出现在/tmp、/dev/shm等非标准目录。进程名和真实程序不符例如显示为sysupdate实际是挖矿程序。一个普通服务账号突然启动了交互式 shell。7. 网络视角谁在连我的端口用户登录看会话进程消耗看ps但“有没有人正在通过你的网络端口进来”就要靠网络连接工具了。这一步经常是最后一个闭环登录可疑 → 找到可疑进程 → 确认这个进程是否正在向外发连接。7.1 ss现代系统首选ss是 iproute2 提供的 socket 查看工具也是目前推荐的方式。最常用的全量命令ss -tunap参数拆解-tTCP 连接-uUDP 连接-n不解析域名和服务名直接显示 IP 和端口-a列出所有连接监听和已建立-p显示对应进程信息需要 root输出的关键部分如下State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:((sshd,pid988,fd3)) ESTAB 0 0 192.168.1.20:22 192.168.1.100:51023 users:((sshd,pid1532,fd4)) ESTAB 0 0 192.168.1.20:443 198.51.100.23:44123 users:((nginx,pid2201,fd14))只看已建立的连接状态ss -tnp state established只看哪些端口处于监听状态ss -lntp如果ESTAB列里出现外部 IP 正在访问你的 SSH 端口并且这个 IP 和当前登录会话的来源对不上说明存在可疑连接。7.2 lsof按端口反查进程lsof不是默认安装但它按端口反查进程非常方便。查看 8080 端口上是谁在监听sudo lsof -i :8080输出会给出进程 PID、用户名、FD 和连接状态。想查某个用户打开的所有网络连接sudo lsof -u alice -i7.3 判断一个连接是否可疑光有连接列表还不够要有判断依据。从网络视角查“谁”要回答三个问题远端 IP 是否在已知范围内如果你的服务器只对办公网开放出现陌生 IP 就要怀疑。连接对应的进程是否正常ss显示 PID 后用ps -ef | grep PID看命令。如果 PID 对应的是 Tomcat 或 Nginx正常对应/tmp/xxx异常。服务是否应该对公网开放ss -lntp里如果发现 MySQL、Redis 等数据库端口监听在0.0.0.0这本身就是安全风险。这时的问题已经不是“谁在连”而是“所有人都有机会连”。网络排查的核心理念进程、连接、登录会话三者必须能互相印证。一个会话对应一个 SSH 连接一个进程对应一组端口如果任何一环对不上号就值得继续往下挖。8. 完整排查流程示例从告警到定位把前面的命令串起来模拟一个完整的排查场景凌晨监控告警显示服务器 load average 异常升高。第一步看整体状态判断是否有人在系统上w如果输出显示只有你自己登录跳到第三步如果出现不认识的用户名和来源 IP记下来继续。第二步追查历史登录记录确认陌生账号是什么时候进来的sudo last -F -n 30 sudo lastb -n 20第三步看 CPU 占用最高的进程ps -eo user,pid,ppid,%cpu,%mem,etime,cmd --sort-%cpu | head -n 20第四步看可疑进程的网络连接sudo ss -tunap | grep 可疑PID第五步复核完整命令路径和进程树ls -l /proc/可疑PID/exe pstree -u 可疑用户第六步核对 SSH 认证日志看这个登录用的是密码还是密钥journalctl -u ssh --since 2025-01-06 00:00:00 | grep 可疑IP到这里就能回答最初的问题看到了谁、从哪里来、在做什么、连接去了哪里。如果判断为入侵或违规访问不要独自继续操作应当立即上报安全负责人在授权范围内保留现场证据并断开可疑会话。这里强调一点整个流程不能破坏现场。不要一上来就kill可疑进程、删掉可疑账号否则后面安全人员取证时关键数据已经被你清理掉了。先记录、再分析、后处置是主机排查的基本顺序。9. 常见问题与排查方法问题现象可能原因排查方式解决方案w显示用户空闲很久但 CPU 占用很高空闲时间统计的是终端输入进程可能在后台运行用ps -u 用户 -o ... --sort-%cpu查看实际进程按 PID 定位进程及命令路径last只能看到很少记录wtmp 轮转旧记录被压缩或删除检查/var/log下的 wtmp.1、wtmp.gz接入日志集中存储避免依赖单机lastb显示无权限或没有记录btmp 不存在或当前不是 root 用户ls -l /var/log/btmp确认文件存在使用sudo执行必要时初始化 btmp 文件ss -tunap看不到进程列普通用户无权读取其他进程信息确认是否使用了 root用sudo ss -tunap执行大量来自陌生 IP 的失败登录SSH 被扫描或爆破lastb、auth.log 查看来源和时间修改 SSH 端口、使用密钥、配置 fail2banps -u 用户看不到某些进程进程通过 sudo 切换了属主pstree -u 用户观察子树结合父子进程关系综合判断连接 IP 与who来源对不上存在代理、跳板或可疑转发ss -tunap查进程ps查命令确认为合法跳板否则阻断连接并告警每一个问题的排查顺序都有讲究先看现象再缩小范围最后做结论。不要因为某条命令输出可疑就直接下“被入侵”的结论要多个视角互相印证。10. 安全边界与最佳实践看得到“谁”是安全审计的第一步但看得过多、处置过猛同样有问题。这里给出几条务实的边界和习惯。第一合法授权优先。查看登录记录、进程和网络连接必须在你有权限管理的机器上进行例如你负责的测试机、开发机或已获得授权的服务器。如果是公司机器要遵守公司的安全规范和审计制度。发现可疑行为后处置前应先通知安全负责人或值班负责人不要在未授权的情况下私自备份、删除或隔离服务器数据。第二最小权限原则。日常巡检用普通用户账号确需 root 时才使用sudo避免长期用 root 登录。lastb、ss -p这类需要特权的命令统一通过sudo执行并且关键操作要能追溯到人。不要把巡检脚本设计成强制 root 运行能只读查看就只读查看。第三从根源减少可疑登录。如果 SSH 大量使用密码登录任何查看命令都不能弥补安全缺口。推荐在服务器上关闭密码登录、只允许密钥# 文件路径/etc/ssh/sshd_config PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes修改后执行sudo systemctl restart ssh或sshd之前务必先保留一个已连接会话并在测试环境验证密钥登录可用否则一旦配置错误可能把自己锁在门外。第四用自动化降低人力成本。每天手动敲w、last不现实。推荐把本文的思路沉淀成定时任务或监控规则每天定时生成登录审计摘要last -n 50、lastb -n 20写入集中日志。对“陌生 IP 成功登录”和“连续失败登录”配置告警。使用 fail2ban 等工具自动拦截频繁失败的来源 IP。第五保护好日志本身。wtmp、btmp、sshd 日志是排查的唯一线索。不要让普通用户修改这些文件日志目录建议做只读保护关键服务器要把日志同步到独立的日志存储中。日志的价值在于它先于事件发生如果攻击者先清掉了日志所有后补措施都是失效的。11. 总结与后续学习方向回到标题你都看到了谁。这篇文章把“看到谁”拆成了四个层面登录会话层面看who、w、last进程层面看ps、pstree网络层面看ss、lsof时间线索层面看lastb、auth.log。四个层面合在一起才能还原一台 Linux 服务器上究竟发生过什么。最值得记住的不是某条命令的参数而是那条排查思路先看会话再追进程最后落到网络连接和日志。任何一个环节发现异常都要回到其他环节印证。只看到一个可疑进程就急着kill往往会破坏后续判断。如果还想继续深入这几个方向值得研究auditd审计框架精确记录文件访问、命令执行等行为适合安全审计场景。journald和日志集中化排查跨主机问题时集中日志比单机翻文件效率高得多。eBPF 动态追踪在不影响业务的前提下观测进程行为适合更深层的异常分析。容器的视角容器环境里“谁”的边界从用户变成了 namespace排查思路会有变化。建议在测试机上把本文的命令都跑一遍先用w、who看自己的登录会话再用ps -eo ... --sort-%cpu看当前有哪些常驻服务最后用ss -lntp盘点这台机器开放了哪些端口。等你不需要看笔记就能把这三个视角串起来时遇到“是谁搞挂了服务器”这类问题就能比大多数人更快给出答案。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门