系统信息取证

本指南针对 Linux 环境下的系统信息取证、端口排查、进程管理、状态监控以及环境变量配置等核心知识点进行了详尽的梳理与重构。

静态取证与版本信息

在\usr\lib\modules下往往有内核版本号 image.png

网络与端口占用排查技术

在系统取证和运维排错中,定位端口和网络连接状态是首要任务。

lsof 命令详解

  • 基础概念:lsof 的全称是 “list open files”,它是一个用于列出当前系统中所打开文件的强大工具。

  • 权限要求:执行带有 -i 等深层探测参数的 lsof 命令时,通常需要 root 用户的最高权限。

  • 核心语法:查看特定端口占用情况的语法格式为 lsof -i:端口号。

  • 实战案例:使用 # lsof -i:8000 可以查看服务器上 8000 端口的占用情况。输出结果会显示占用该端口的 COMMAND(如 nodejs)、PID(进程号,如 26993)、USER(所属用户,如 root)以及状态(如 LISTEN)等详细信息。

  • 扩展参数矩阵:

    • lsof -i:8080:专门用于查看 8080 端口的占用情况。
    • lsof abc.txt:用于显示当前正在开启并使用 abc.txt 这个文件的进程信息。
    • lsof -c abc:用于显示以 abc 开头的进程当前所打开的所有文件列表。
    • lsof -c -p 1234:精准列出进程号(PID)为 1234 的进程所打开的全部文件。
    • lsof -g gid:用于显示归属于特定 gid(用户组 ID)的进程情况。
    • lsof +d /usr/local/:显示指定目录下被各个进程所开启的文件(不包含子目录)。
    • lsof +D /usr/local/:功能同上,但会深度遍历并搜索该目录下的所有子目录,由于搜索范围广,执行时间通常较长。
    • lsof -d 4:显示当前正在使用文件描述符(fd)为 4 的所有进程。
    • lsof -i -U:综合显示系统中所有打开的网络端口以及 UNIX domain 文件。

netstat 命令详解(网络状态分析)

  • 基础概念:netstat 是一个极其有用的工具,专门用来监控 TCP/IP 网络,它可以显示路由表、实际的活动网络连接以及每一个网络接口设备的工作状态信息。

  • 端口占用查看组合:netstat -tunlp | grep 端口号 是最常用的端口查询黄金组合。

  • 高频核心参数解析:

    • -a 或 --all:列出当前系统中所有的连线(包含监听和未监听的 Socket)。
    • -t:仅过滤并显示 TCP 传输协议相关的连线状况。
    • -u:仅过滤并显示 UDP 传输协议相关的连线状况。
    • -n 或 --numeric:拒绝显示别名,直接使用数字格式显示 IP 地址和端口号,不通过域名服务器进行反向解析。
    • -l 或 --listening:仅列出当前处于 Listen(监听)状态的服务器 Socket。
    • -p 或 --programs:显示建立相关网络链接的程序名称和对应的程序识别码(PID)。
    • -c 或 --continuous:持续不断地列出当前的动态网络状态。
    • -e 或 --extend:显示网络相关的其他延伸信息。
    • -g 或 --groups:显示多重广播(Multicast)功能群组的组员名单。
    • -i 或 --interfaces:显示系统的网络界面(网卡)信息表单。
    • -r 或 --route:显示系统的核心路由表(Routing Table)。
    • -s 或 --statistics:按协议显示网络工作信息的详细统计表。
  • 实战应用场景举例:

    • 查看 8000 端口:netstat -tunlp | grep 8000。
    • 查看所有 TCP 端口:netstat -ntlp。
    • 追踪 UDP 端口使用:netstat -apu 可以详细显示 UDP 的活跃连接和进程程序名。
    • 查看网卡流量统计:netstat -i 可以查看诸如 eth0、lo 等网卡的 MTU、RX-OK(接收正常)、TX-OK(发送正常)等数据包统计。
    • 查看组播组成员:netstat -g 可查阅 IPv4 和 IPv6 的组播订阅情况。
    • 网络协议全局统计:netstat -s 能够分门别类地输出 Ip、Icmp、Tcp、Udp、TcpExt 等协议的接收、发送、丢弃、重传等海量统计数据。
    • 查看仅限服务端的监听接口:netstat -l 能够纯粹列出系统对外暴露的监听端口及 UNIX domain sockets。

核心服务进程管理与监测

在 Linux 生态中,ps 和 top 被公认为最强大、最核心的进程管理命令。

ps 命令(静态进程快照)

  • 基础概念:ps 命令是最基本且功能非常强大的进程查看命令。它常被用于监控后台进程的工作情况,因为后台进程无法与屏幕、键盘等标准输入/输出设备通信。

  • 核心功能:通过执行该命令,管理员可以确定哪些进程正在运行、进程所处的运行状态、进程是否已经结束、是否存在僵死(Zombie)进程,以及哪些进程占用了过多的系统资源等。

  • 常用选项与参数:

    • -a:显示系统中所有进程的信息快照。
    • -e 或 -A:列出系统中所有的进程信息。
    • -f:以全格式显示进程的所有详细信息。
    • -l:以长格式展现进程的详细信息。
    • -r:过滤并只显示当前正在运行状态的进程。
    • -u:以面向用户的格式显示信息(包含用户名、CPU 以及内存的使用情况等)。
    • -x:显示所有非控制终端上的后台进程信息。
    • -p:精准显示由特定进程 ID (PID) 指定的进程信息。
    • -w:加宽输出显示,以便完整呈现较多的命令行资讯。
  • 输出字段深度解析(以 ps -aux 或 ps -axu 格式为例):

    • USER:指示启动该进程的所属用户名。
    • PID:代表进程的唯一标志号
    • %CPU:反映该进程占用的 CPU 运行时间与总运行时间之比的使用率。
    • %MEM:反映该进程占用的物理内存与系统总内存之比的使用率。
    • VSZ:指示进程所占用的虚拟内存大小(单位通常为 KB)。
    • RSS:指示进程实际占用的物理内存数值(单位为 KB)。
    • TTY:指出该进程建立时所对应的控制终端,如果显示为“?”则表示该进程不占用任何控制终端(通常为后台服务)。
    • STAT:展示进程当前的运行状态代码,核心代码包括:
      • D:不可中断的睡眠状态(通常是在等待 I/O 的进程)。
      • R:就绪或正在执行状态(存在于可运行队列中)。
      • S:睡眠或静止状态。
      • T:被跟踪状态或暂停执行状态。
      • Z:终止(僵死)状态,这类进程实质已不存在,但系统暂时无法消除其记录。
      • W:表明系统没有足够的内存分页可供分配。
      • <:标识此进程为高优先级的进程。
      • N:标识此进程为低优先级的进程。
      • L:表示该进程有内存分页分配并被强制锁在内存体内(常见于实时系统或 I/O 操作)。
    • START:记录了该进程最初的开始启动时间。
    • TIME:记录了该进程实际消耗的 CPU 执行时间。
    • COMMAND:展示启动该进程对应的命令名或执行的指令详细内容。
  • 高级查询技巧:由于 ps 执行后产生的结果条目往往太多,实战中通常会结合 grep 参数来精确定位所需的进程号。例如查找 PHP 进程:ps -ef | grep php;或者查找 Nginx 进程:ps -axu| grep -v grep| grep nginx。

top 命令(动态资源监控器)

  • 基础概念:top 命令能够动态、实时地显示服务器的进程信息,类似于 Windows 系统下的任务管理器。它的特点是会自动把占用系统资源最高的进程排列在最前面。

  • 头部全局信息解析(前五行):

    • 第一行:依次表示当前系统时间、系统自启动以来的运行时长、当前登录系统的总用户数、以及系统的平均负载(Load Average)。
    • 第二行:统计所有任务(Tasks)的状态,包括启动的总数、正在运行的进程数、挂起(Sleeping)的进程数、停止的进程数以及无用(Zombie 僵死)的进程数。
    • 第三行:详尽显示当前 CPU 的使用率情况,涵盖用户空间占用比例(%us)、系统内核占用比例(%sy)、改变过优先级的进程占用率(%ni)、闲置(Idle)比例(%id)、等待 I/O 的百分比(%wa)、硬件中断(%hi)、软件中断(%si)等。
    • 第四行:展示物理内存(Mem)的使用分布情况,包括系统总的可使用内存、已经使用的内存、当前空闲内存,以及被缓冲区(buffers)占用的内存。
    • 第五行:展示交换分区(Swap)的使用详情,包括系统总的交换分区大小、已使用的分区、空闲的分区以及用于高速缓存(cached)的交换分区大小。
  • 进程列表字段解析(第六行及以下):

    • PID (Process ID):进程的标志号,表现为非零的正整数。
    • USER:该进程所有者的具体用户名。
    • PR:系统分配给进程的优先级别。
    • NI:代表进程的优先级别数值。
    • VIRT:进程当前占用的虚拟内存总值。
    • RES:进程当前实际占用的物理内存总值。
    • SHR:进程运行过程中使用的共享内存总值。
    • STAT:直观表示进程的状态(如 S 为休眠,R 为运行,Z 为僵死,N 提示优先值为负数等)。
    • %CPU:进程独占的 CPU 使用率百分比。
    • %MEM:进程占用的物理内存与系统总内存的百分比比例。
    • TIME+:进程自启动后累计占用的总 CPU 时间。
    • COMMAND:启动该进程的命令名称;如果终端界面宽度不足,通常会在进程行中包含完整的命令行。
  • 交互式快捷键功能:在 top 命令的动态界面中,可以通过输入快捷键实现交互式控制:

    • <空格>:立刻强制刷新屏幕并更新各项主要参数指标。
    • P:强制列表根据 CPU 占用率的多少进行降序排序。
    • M:强制列表根据进程使用物理内存的大小进行降序排序。
    • T:强制列表根据进程的累计运行时间进行排序。
    • m:一键切换是否显示头部内存详细信息。
    • t:一键切换是否显示头部的进程统计和 CPU 状态信息。
    • c:动态切换只显示命令简短名称或展开显示完整的命令行路径。
    • W:将用户当前的交互设置(如排序方式、列显示)永久写入到 ~/.toprc 配置文件中,这是官方推荐的保存 top 配置的方法。
    • q:平滑退出 top 监控界面。

进程检索与终止工具

  • pgrep 进程查找:

    • 作用:用于精确查找当前正在运行的进程,并只列出满足匹配给定条件的进程 PID 号。
    • 规则:所有指定的条件都必须完全匹配,相关的进程才会被列出展示,且该命令对所有用户开放使用权限。例如执行 pgrep nginx 将输出一列干净的 Nginx 相关的 PID 数字。
  • kill 进程终止:

    • 作用:核心作用是向操作系统内核发送一个系统操作信号和目标程序的 PID,以终止一个特定进程。
    • 局限与应用场景:对于前台进程,用户通常可以使用 Ctrl+C 组合键直接中断;但对于脱离终端的后台进程,Ctrl+C 是无效的,此时必须动用 kill 命令。
    • 命令语法:kill [-s signal |-p] [-a] pid… 或者 kill -l [signal]。
    • 核心选项:-s 用于指定要发送的具体信号;-p 用于模拟发送信号(不实际执行);-l 打印指定信号的名称列表。
    • 核心工作信号:系统预设的默认终止信息为 SIGTERM(15),用于请求程序正常自我终止。如果进程无响应或无法使用预设信号终止,可以使用终极的 SIGKILL(9) 信息(即 kill -9)来尝试强制且无条件地删除程序,此操作尤其适用于清理顽固的僵尸进程。
  • killall 批量终止:

    • 作用:相较于 kill 必须提供具体的 PID 进行逐一清理,killall 允许管理员通过指定程序的具体名字,一次性、直接地杀死属于该名字的所有相关进程。例如,若要杀掉 nginx 的 9 个进程,用 kill 需要执行 9 次,而使用 killall nginx 则能一次性轻松解决批量进程终止的问题。
    • 附加工具:工作中还可以利用 pkill 命令,该工具在服务器日常管理中用于“踢出”异常在线用户或批量处理非常方便。

全面系统状态监控与性能分析

w 命令(会话监控)

  • 基础概念:w 是一个用来显示当前系统有哪些登录用户以及这些用户正在执行何种操作的实用命令。
  • 附加价值:除了展示用户会话外,该命令还在头部提供系统运行时长(uptime)以及系统的平均负载(load average)宏观情况。
  • 语法:w [OPTIONS] [USER]。

vmstat 命令(虚拟内存与资源简报)

  • 基础概念:vmstat 是最常见的、轻量级的系统监控工具之一。
  • 监控范围:它可以展示在给定时间间隔下的服务器状态评估值,覆盖面包括服务器的 CPU 使用率、物理内存使用、虚拟内存(Swap)的交换情况以及 IO(磁盘)的底层读写情况。
  • 核心语法:vmstat [seconds_time] [times],该语法明确表示将在 seconds_time 秒的时间间隔下,连续进行 times 次的系统状态数据输出。

sar 命令(全能性能分析巨兽)

  • 基础概念:sar 命令被誉为目前 Linux 系统上最为全面、体系最为完整的系统性能分析分析工具之一,它能够从硬件层面到软件层面进行多维度的深入剖析。

  • 核心选项:

    • -A:强制输出所有可能报告的最终总和统计。
    • -u:专门输出关于 CPU 使用情况的各类详细统计信息。
    • -q:针对系统运行队列和系统平均负载情况进行深度分析。
    • -r:输出系统的物理内存以及交换空间(Swap)使用率的统计信息。
    • -W:输出系统的换页活动(Swap I/O)详细统计信息。
    • -b:显示底层块设备的 I/O 活动和总数据传送速率的统计信息。
    • -d:详细输出系统中每一个块设备(物理磁盘)的个别活动信息。
    • -n:针对网络模块进行专门统计(支持 DEV, EDEV, SOCK, TCP 等特定关键字)。
    • -v:输出系统核心层面的 inode、文件句柄以及其他内核关键表的统计信息。
    • -p:为每一个独立的 CPU 核心单独报告其运行状态。
    • -B:专门显示系统内存分页的换页状态。
    • -y:针对终端设备活动情况的专门统计。
    • -R:输出底层的内存页面总计统计信息。
    • -i:用于设定读取或刷新状态信息的特定间隔时间。
    • -f:支持从之前生成的指定二进制数据文件中提取并回放历史报告。
    • -e:用于设置历史数据显示报告的最终结束时间点。
    • -o filename:以二进制的高效格式把当前追踪结果存入到指定的文件中(注意:生成的二进制文件不能使用 cat、more、less 等常规文本工具查看,必须使用 sar -f filename 命令进行还原查看)。
  • 专项领域统计深度解析:

    • CPU 统计 (sar -u):统计输出包含 %user(用户空间占用率)、%nice(改变优先级的占用率)、%system(内核空间占用率)、%iowait(等待 IO 的比例)、%steal(被虚拟化环境偷取的比例)、%idle(绝对空闲比例)。

    • 平均负载统计 (sar -q):揭示队列压力,输出 runq-sz(运行队列的等待进程长度,经验表明每核不应超过 3 个)、plist-sz(进程列表中总的 processes 和 threads 数量)、以及 ldavg-1、ldavg-5、ldavg-15(分别代表系统最后 1、5、15 分钟将多核 CPU 负载相加后除以核心数得出的动态平均值)。

    • 内存统计 (sar -r):精确分析内存,包括 kbmemfree(空闲物理内存大小)、kbmemused(使用中的物理内存)、%memused(物理内存总使用率)、kbbuffers(内核中纯粹作为缓冲区使用的物理内存大小)、kbcached(系统缓存的文件数据大小)、kbcommit(为确保系统内存不发生溢出崩溃而必须保证的最少内存量)、%commit(kbcommit 量与包含物理和 Swap 在内的系统总内存的百分比)。需要注意,kbbuffers 和 kbcached 的数值与 free 命令输出的 buffer 和 cache 在含义上完全一致。

    • Swap 分区统计 (sar -W):监控系统虚拟内存的交换速率,输出 pswpin/s(每秒换入)和 pswpout/s(每秒换出)。

    • 全局磁盘 I/O 统计 (sar -b):评估整体吞吐能力,包含 tps(系统所有磁盘每秒钟产生的物理 IO 请求总数,对应 iostat 的 tps)、rtps(每秒读取请求总数)、wtps(每秒写入请求总数)、bread/s(每秒钟从磁盘读取的逻辑块总数)、bwrtn/s(每秒钟实际写入到磁盘的块总数)。

    • 单盘使用详情 (sar -d):若配合 -p 参数可以显示直观的磁盘设备名称(DEV)。输出详情涵盖 tps(每秒传输数)、rd_sec/s(每秒读取的底层扇区总数)、wr_sec/s(每秒写入扇区总数)、avgrq-sz(平均每次磁盘 IO 请求操作包含的扇区数据大小)、avgqu-sz(磁盘底层请求队列堆积的平均长度)、await(完成每次请求的平均消耗耗时,单位为毫秒,该值等于磁盘寻道时间 + 请求队列排队时间 + 服务处理时间)、svctm(仅仅是 IO 服务处理的绝对时间,不含排队时间)、%util(核心指标:IO 请求占用的总 CPU 处理时间百分比,该值越高,明确表明底层 IO 瓶颈越严重,速度越慢)。

    • 网络综合分析 (sar -n):支持 6 个核心开关(DEV,EDEV,NFS,NFSD,SOCK,TCP 以及各种 IPv6 变种等),甚至可以使用 FULL 关键字输出 DEV、EDEV、SOCK 的终极综合版。

      • sar -n DEV:监控网卡常规流量,输出 IFACE(网卡名称,如 eth0, lo)、rxpck/s 与 txpck/s(每秒收发的包数量)、rxKB/S 与 txKB/S(每秒收发的实际千字节带宽)、rxcmp/s 与 txcmp/s(每秒收发的压缩数据包量)、rxmcst/s(每秒接收的多播数据包数量)。
      • sar -n EDEV:专门诊断网络设备通信层的失败与错误事件,输出 rxerr/s 与 txerr/s(每秒收发阶段的错误包量)、coll/s(在半双工模式下每秒发生的网络冲撞次数)、rxdrop/s 与 txdrop/s(因网卡缓冲区溢出爆满导致在收发端每秒钟强行丢掉的网络包数目)、txcarr/s(发送时每秒钟发生的载波错误总次数)、rxfram(接收时发生的帧对其错误的频次)、rxfifo 与 txfifo(收发阶段底层 FIFO 缓冲区溢出的具体错误发生次数)。
      • sar -n SOCK:分析系统套接字资源,输出 totsck(系统总计被使用的 socket 总数)、tcpsck(TCP 专用 socket 总数)、udpsck(UDP 专用 socket 总数)、rawsck(RAW 模式 socket 总数)、if-frag(当前系统存在的 IP 分片数目)、tcp-tw(TCP 协议中处于 TIME-WAIT 回收状态的堆积连接数量)。
      • sar -n TCP:专注 TCP 连接状态,输出 active/s(由本端主动发起的新连接数)、passive/s(本端被动接受的新连接数)、iseg/s(接受的总网段数)、oseg/s(输出的总网段数)。
      • 其他网络诊断开关包括监控 IP 报文情况(IP/EIP)等。
    • 内核进程与文件状态 (sar -v):监控内核表溢出风险,追踪指标包括 dentunusd(在系统缓冲目录条目池中尚未被分配使用的可用条目数量)、file-nr(当前被系统及所有进程实际占用的文件句柄总数量)、inode-nr(系统当前已经分配和使用的索引节点总数量)、pty-nr(系统当前正在使用的伪终端 pty 数量)。

辅助网络与内存监控工具

  • nload 网络流量监控仪:

    • 作用:专门用于实时、图形化地查看 Linux 系统网络带宽流量状况,输出非常直观。
    • 安装方式:在 CentOS 体系下执行 yum install -y epel-release 及 yum install -y nload 进行部署;在 Ubuntu 体系下直接执行 apt install -y nload 进行安装。
  • free 内存审计命令:

    • 作用:专门用于显示当前系统的整体内存使用情况,统计范围包括实体物理内存容量、虚拟的交换文件(Swap)内存、共享内存区段总量,以及被系统核心强制使用的缓冲区总量等关键信息。

    • 参数控制:

      • -b、-k、-m:强制规定分别以 Byte(字节)、KB、MB 为基本单位来展现系统的内存容量。
      • -h:启动人类易读模式(Human-readable),系统会自动计算对应的容量并以恰当的单位展现(最大保留三位数),支持自动识别计算的单位包括 B(bytes)、K(kilos)、M(megas)、G(gigas)以及 T(teras)。
      • -o:在输出界面中强行隐藏/不显示用于缓冲区调节的那一行统计数据。
      • -s<间隔秒数>:设定定时器,按照给定的秒数间隔持续、不间断地观察并刷新内存的动态使用状况。
      • -t:在标准的输出列表下方,额外附加并显示所有被使用的物理内存和 Swap 内存的总和列(Total 列)。

安全审计

在处理应急响应或日常审计时,用户登录行为和历史指令的溯源是关键环节。

  • 系统时间校验:

    • 可以通过执行 timedatectl status 命令,获取当前服务器内核的精确时间状态及 NTP 同步情况。
  • 活跃登录追踪 (who 命令):

    • 使用 who 命令可以立刻查阅并输出当前处于活跃状态、正在登录系统的用户状况信息(如登录终端类型和 IP 地址)。
  • 近期登录审计 (last 命令):

    • last 命令能够精准列出最近一段历史时间范围内的系统用户登录时间明细以及来源的 IP 记录数据。
    • 其底层逻辑是自动读取固定位于 /var/log 目录下的核心数据文件 wtmp,并将该二进制文件中记录的每一次登入系统的历史用户名单转化并全部打印显示出来。
  • 全局用户登录历史 (lastlog 命令):

    • 相较于 last 关注近期时间流,lastlog 命令旨在全量列出系统中所有注册用户的最后一次登录情况历史。
    • 如果某个系统内置账号(如 daemon, bin, sys 等)从未登录过,该命令会直白地标记显示为 “Never logged in”;如果存在真实登录历史,则会清晰完整地显示出登录时所使用的源端 ip 以及精准的登录时间点。
  • 授权日志深度分析 (/var/log/auth.log 文件):

    • 除了直接使用命令,审计人员必须通过查看核心的 /var/log/auth.log 文件(基于 Debian/Ubuntu 体系),以深度分析系统中发生的各种用户登录验证以及权限行为。
    • 通过使用 cat /var/log/auth.log |more 等命令进行分页查看,安全人员可以分析出用户尝试建立会话(session opened)、退出会话(session closed)的历史轨迹,包括系统定时任务(如 pam_unix 模块和 cron 服务)在后台自动执行时的提权或会话记录。
  • 操作指令追溯 (history 命令):

    • 利用 history 命令,可以调取当前用户在命令行终端中曾经敲击并执行过的历史命令列表,这是排查人为误操作或恶意后门执行指令的关键取证步骤。

日志与登录审计

系统常规日志

/var/log/syslog (或者在一些系统上是 /var/log/messages) 是一个包含各种系统事件的通用日志文件。它通常是系统管理员和安全分析师在排查问题或调查安全事件时的首选资源。

/var/log/syslog 记录的信息非常广泛,包括但不限于:

  • 系统启动和关机信息: 记录系统启动和关机过程中的关键事件。
  • 硬件事件: 例如设备连接、驱动加载失败等。
  • 邮件服务器信息: 例如邮件发送和接收的记录。
  • 系统守护进程信息: 例如 cron、syslogd 等守护进程的运行状态和错误信息。
  • 认证相关信息: 虽然 /var/log/auth.log 更专注于认证事件,但 /var/log/syslog 也可能包含一些认证相关的消息,尤其是在 auth.log 未配置或不可用时。
  • 应用程序日志: 一些应用程序会将日志信息写入 syslog,而不是单独的日志文件。
  • 内核消息: 虽然 /var/log/kern.log 更专注于内核消息,但 /var/log/syslog 也可能包含一些内核相关的消息,尤其是在 kern.log 未配置或不可用时。
  • 其他系统事件: 例如网络连接、文件系统错误、服务启动失败等。

syslog 的重要性

  • 集中式日志记录: syslog 提供了一个集中式的位置来存储各种系统事件,方便管理员进行监控和管理。
  • 故障排除: 当系统出现问题时,syslog 是一个重要的信息来源,可以帮助管理员快速定位问题所在。
  • 安全审计: syslog 中记录的安全相关事件可以用于安全审计和入侵检测。
  • 系统监控: 通过监控 syslog 中的事件,可以及时发现系统异常并采取相应的措施。

登录日志文件(utmp/wtmp/btmp)

Linux用户登录信息放在三个文件中:

1、/var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记录系统启动时间;

2、/var/log/wtmp:记录当前正在登录和历史登录系统的用户信息,默认由last命令查看;

3、/var/log/btmp:记录失败的登录尝试信息,默认由lastb命令查看。

这三个文件都是二进制数据文件,并且三个文件结构完全相同,是由/usr/include/bits/utmp.h文件定义了这三个文件的结构体。

默认情况下文件的日志信息会通过logrotate日志管理工具定期清理。logrotate的配置文件是/etc/logrotate.conf,此处是logrotate的缺省设置,通常不需要对它进行修改。日志文件的轮循压缩等设置存放在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下,它会覆盖缺省设置。

如果不想记录相关信息,则可以直接将相关文件删除即可。如果系统不存在该文件,则需要在此路径touch一个文件就可以继续记录相关信息了。

特征/var/log/wtmp/var/log/btmp/var/log/utmp
内容用户登录/注销历史失败的登录尝试当前登录的用户
格式二进制二进制二进制
查看工具lastlastbw, who, users
用途追踪用户登录活动调查失败登录查看当前登录用户

此外:

如果想禁用who命令,则只需要将utmp的可读权限去掉就行,这样非root用户就不能用此命令了;如果是btmp文件,手工创建的话注意权限必须为600,否则不能正确写入信息。

认证日志

  • 目的: 记录认证事件,包括成功和失败的登录、sudo 命令以及其他安全相关的活动。
  • 位置: /var/log/auth.log (Debian/Ubuntu) 或 /var/log/secure (Red Hat/CentOS/Fedora)。
  • 内容:
    • 用户登录 (SSH、控制台等)
    • sudo 命令使用
    • 认证失败 (密码错误、无效用户)
    • 用户帐户更改 (密码更改、组修改)
    • SSH 密钥使用
  • 查看: less /var/log/auth.log、grep "sshd" /var/log/auth.log (过滤 SSH 事件)、journalctl -u sshd (用于 systemd 系统)。
  • 重要性: 对安全审计和调查未经授权的访问尝试至关重要。

内核日志

  • 目的: 记录来自 Linux 内核的消息,提供有关硬件和驱动程序问题的见解。
  • 位置: /var/log/kern.log (传统的 syslog) 或通过 dmesg 命令访问。
  • 内容:
    • 设备检测和初始化
    • 驱动程序加载和错误
    • 系统资源分配
    • 内核警告和错误
    • 模块加载/卸载
  • 查看: less /var/log/kern.log、dmesg、dmesg | grep "error" (过滤错误信息)、journalctl -k (用于 systemd 系统)。
  • 重要性: 对于诊断硬件问题、驱动程序冲突和内核相关错误至关重要。

环境变量

Linux 系统中定义了大量的变量以控制运行环境,理解其生效周期和配置逻辑是系统管理的基础。

1. 变量种类

按照变量在系统中的生命周期和生效范围长短来严格划分,Linux 系统内的变量可明确分为两大类:

  • 永久性变量:这类变量的特点是必须通过修改具体的底层配置文件才能生效,一旦配置完成并被系统加载,该变量将永久保持生效状态,不会因为重启终端而丢失。
  • 临时性变量:这类变量仅通过使用 export 命令在当前终端界面中即时声明即可立刻生效,但其致命缺陷在于:一旦关闭当前所处的 shell 终端,该变量将随之彻底失效被销毁。

2. 设置与持久化环境变量

  • 途径一:修改 /etc/profile(针对系统所有用户永久生效全局变量)

    • 操作逻辑:通过文本编辑器(如 VI)对 /etc/profile 这个系统级文件增加变量定义,所定义的该变量将会对当前 Linux 系统下的每一个用户均有效,并且由于写在了磁盘文件中,它具备绝对的“永久性”。
    • 操作示例:使用 vi /etc/profile 打开文件后,在末尾添加 export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib。
    • 生效警告:请注意,直接修改完该文件后系统并不会马上使其生效,必须手动运行指令 # source /etc/profile 强行加载一遍,否则该修改只能在下一次重新进行用户登录验证时才会自然生效。
  • 途径二:修改 .bash_profile(针对单一用户永久生效局部变量)

    • 操作逻辑:使用文本编辑器(如 VI)打开并编辑处于特定用户家目录(如 /home/guok)下的隐藏文件 .bash_profile,在此处增加的任何变量,仅会对该特定当前用户产生作用,不影响系统内其他用户,且它同样是固化在文件中的“永久的”属性。
    • 操作示例:运行 vi /home/guok/.bash_profile,并在文件中追加如下内容 export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib。
    • 生效警告:同样地,修改文件后要想让当前环境马上生效加载该参数,必须主动执行 $ source /home/guok/.bash_profile 命令,否则只能被动等待下次重新登录进此用户环境时才会自动生效。
  • 途径三:运行 export 命令(仅对当前终端及其子终端生效临时变量)

    • 操作逻辑:在任意 shell 的命令行提示符界面下,直接通过输入 export 变量名=变量值 这种标准语法格式来快速定义一个变量。
    • 局限性:通过此方法创建的变量仅仅局限在当前你所在的 shell(即 BASH 进程)或者是其直接衍生派生的子 shell(BASH) 环境下才是完全有效的。一旦当前的 shell 会话被关闭或断开连接,这个存在于内存中的临时变量也就彻底失效了,再次打开新的系统 shell 时将不再存在这个变量,如果业务仍然需要的话,则还需要管理员手动重新执行声明定义。

3. 环境变量的审阅与销毁机制

  • 变量查看命令矩阵:

    • echo:可以通过指定具体的变量名(配合美元符号)来查看系统的单个环境变量值,例如使用 echo $PATH 命令。
    • env:专门用于在终端中铺开显示当前系统配置下的所有的全局环境变量清单。
    • set:除了环境变量外,使用该命令还能查看所有包括本地在内定义的复杂环境变量及内部功能变量参数。该命令同时还能用于手动设定某个环境变量的具体值。
  • 变量安全销毁 (unset):

    • 作用机制:如果需要彻底清除内存中某个环境变量的内容与值,必须使用 unset 命令,如果在销毁前未特别指定赋新值,则该指定的变量值将直接被底层系统强行设为 NULL(空)。
    • 销毁验证流程实例:
      1. 首先使用 export TEST="Test..." 新增加并定义一个名为 TEST 的临时环境变量。
      2. 接着运行 env|grep TEST,此时屏幕将有输出内容(显示 TEST=Test...),该现象反向证明我们刚刚建立的环境变量 TEST 已经切实存在于系统之中了。
      3. 然后我们执行 unset TEST 命令,要求系统彻底删除名为 TEST 的这个环境变量。
      4. 最后,我们再次运行 env|grep TEST 进行复测,此时将发现此命令已经没有任何输出了,该静默现象直接证明了环境变量 TEST 已经被成功且彻底地删除掉了。

4. 重点系统预设环境变量速查表

Linux 系统内部自带并维护了大量决定系统底层运行规律的常量,以下为最核心常用的几个系统预设环境变量字典:

  • PATH:该核心变量决定了用户在命令行输入指令时,系统底层的 shell 程序将会自动到哪些指定的系统目录路径中去寻找对应的执行命令或程序二进制文件。
  • HOME:该变量永远指向当前正在操作系统的那个用户所拥有的私有主目录(家目录)绝对路径。
  • HISTSIZE:该数值变量明确规定了系统 shell 命令执行记录(即 history 命令所依赖的日志池)所允许保留的系统历史记录最大条数。
  • LOGNAME:该变量记录了当前正在使用系统的用户的原始登录名名称。
  • HOSTNAME:该变量特指并记录了当前这台 Linux 操作系统所在的网络主机的完整名称字符串。
  • SHELL:该变量用于标识当前用户所身处和正在使用的命令行 Shell 程序的类型标识(例如 /bin/bash 等)。
  • LANGUGE:该系统级变量专门存放语言编码相关的环境变量设定,如涉及到系统的多语言包或国际化显示要求,则通常需要手动或自动去修改配置此特定的环境变量。
  • MAIL:该变量指向了当前操作系统用户对应的电子邮件默认存放收件箱物理目录路径。
  • PS1:该变量全权决定了我们在命令行界面所看到的左侧基本输入提示符的具体外观形式。默认设定下,对于拥有最高权限的 root 系统级超级用户,其符号呈现为严肃的 # 号;而对于普通的基层用户权限,其基本提示符则默认呈现为标准的 $ 号。