进程管理与特权执行

进程是系统里正在运行的程序,由 Linux 内核统一负责调度和管理。为了方便追踪,内核会为每一个进程分配一个唯一的标识号,即进程标识符(Process ID, PID)。PID 通常从 1 开始随着进程启动的先后顺序递增。

作为安全测试人员或系统管理员,你不仅需要查看进程,还要能在程序失去响应或暴露安全风险时快速定位并将其终止。

查看系统进程:ps 与 top

静态列出进程:ps

直接执行 ps 可以列出当前终端会话下属于你当前用户的所有运行进程。 为了查看系统上所有用户运行的进程以及不与终端绑定的系统级服务进程,需要使用 aux 选项:

crow@opsbox:~$ ps aux

ps aux 的输出通常包含以下核心字段:

  • USER:运行该进程的系统用户名。
  • PID:进程的唯一标识号。
  • %CPU:该进程占用的 CPU 算力百分比。
  • %MEM:该进程占用的物理内存百分比。
  • STAT:进程当前状态(如 S 代表睡眠,R 代表运行中,T 代表被挂起/暂停)。
  • COMMAND:启动该进程的具体命令名称。

动态实时统计:top

ps 仅提供命令执行瞬间的静态快照。若要实时监控进程状态,可以使用 top 命令:

crow@opsbox:~$ top

top 界面默认约每 3 秒刷新一次数据,展示系统负载与占用资源最高的进程列表。你可以使用方向键上下浏览,按下键盘上的 q 键即可退出。 Linux top 命令动态监控界面:顶部显示运行时长、任务数与 CPU/内存汇总,下方为按资源占用排序的进程表 图:VulcanSphere · Wikimedia Commons · GNU GPL

管理进程信号与终结操作:kill、pgrep、pkill

发送终止信号:kill

你可以通过向进程发送特定的信号来控制它的运行或终止。 使用 kill 命令并指定对应的 PID,即可发送终止信号:

crow@opsbox:~$ kill PID

常用的进程控制信号包括:

  • 1(SIGHUP):挂断信号。当控制该进程的终端被关闭时发送,常用于让后台服务重新加载配置文件。
  • 2(SIGINT):中断信号。当你在终端按下 Ctrl + C 时,系统会发送该信号给前台进程使其停止。
  • 9(SIGKILL):强制杀除。内核会立即终止该进程,不给予其执行任何清理或保存任务的机会。当程序卡死时常用此信号。
  • 15(SIGTERM):终止信号(默认发送)。通知进程安全退出,允许其先释放资源和保存状态。
  • 19(SIGSTOP):暂停信号。强行停止进程,使其无法再处理任何任务。
  • 20(SIGTSTP):挂起信号。当你在终端按下 Ctrl + Z 时发送,用于暂停前台进程并将其放入后台。

例如,若需要强行中止 PID 为 10825 的程序,可执行:

crow@opsbox:~$ kill -9 10825

提示

在安全渗透中,为什么要快速杀进程? 当你在目标机器上执行某些高频扫描或不小心触发了死循环脚本时,如果不及时杀掉进程,目标服务器的 CPU 可能会瞬间飙升至 100%,这极易触发蓝队管理员的警报。因此,快速定位并终结风险进程是基本的生存技能。

按名称检索与终结:pgreppkillkillall

在现实中,每次都先运行 ps aux 再用 grep 过滤出 PID,然后执行 kill 是非常繁琐的。你可以使用更高级的命令来简化这一流程:

  • pgrep:直接通过进程名称查询其对应的 PID。例如,查询所有与 ssh 相关的进程 ID:
    crow@opsbox:~$ pgrep ssh
    
  • pkill:直接根据进程名称发送信号,终结所有匹配的进程。例如,强制杀掉所有名字中包含 apache 的进程:
    crow@opsbox:~$ pkill -9 apache
    
  • killall:要求提供精确的进程名称进行终结:
    crow@opsbox:~$ killall -9 ping
    

进程终止信号判读

练习

在 Linux 系统中,如果某个服务程序冻结或卡死,你需要强行且立即强制终止它,不给它做任何清理或保存的机会,应该在 kill 命令后配合发送几号数字信号?请提交对应的阿拉伯数字(例如 15)。

提交答案

题解 Hint

守护进程与 systemctl

守护进程是指在系统后台持续运行且不需要用户直接交互的特殊系统服务。许多守护进程的名称以字母 d 结尾(例如 SSH 服务端程序 sshd),但这不是命名规则。

在 Linux 中,内核在系统引导启动后会拉起第一个初始进程,即初始进程。在现代 Ubuntu 主机的初始 PID 命名空间中,这个进程通常是 systemd(PID 为 1)。服务与进程会经由它或其他父进程形成进程树;孤儿进程也会由 PID 1 接管。

为了实现资源隔离与安全性,系统会使用命名空间划分计算资源。例如 PID 命名空间会限制进程可见性:父命名空间可以看到子命名空间中的进程,子命名空间不能反向看到父命名空间中的进程。

我们可以使用 systemctl 工具与 systemd 守护进程进行交互,来管理和查询系统服务。命令的基本结构为:

systemctl [选项] [服务名]

常用操作选项包括:

  • status:查看服务当前运行状态与最近的日志记录。
    crow@opsbox:~$ systemctl status ssh
    
  • start:启动服务。
  • stop:停止运行服务。
  • enable:设置服务为开机自启。
  • disable:取消服务的开机自启设置。

若需要列出系统上当前加载的所有服务,可以执行:

crow@opsbox:~$ systemctl list-units --type=service

进程的前台与后台切换

当命令在前台运行时,会独占你的终端窗口,让你无法输入新命令。对于一些耗时较长的任务,我们可以使用前后台切换技术:

  • 在命令启动时直接放入后台:在命令末尾添加 & 符号。例如,在后台运行一个向本机发送 ping 的测试进程:
    crow@opsbox:~$ ping -c 10 localhost &
    
    执行后,终端会打印出类似 [1] 10825 的回显,代表该任务是 1 号后台任务,对应的进程 PID 是 10825。
  • 暂停并放入后台:如果命令已经在前台运行,按下 Ctrl + Z,前台进程会被暂停并挂起。
  • 查看后台任务:使用 jobs 命令列出当前终端会话中所有的后台任务。
    crow@opsbox:~$ jobs
    
  • 让暂停的后台任务继续运行:使用 bg 命令加任务编号(如 1),可以将暂停的任务放入后台默默继续执行。
    crow@opsbox:~$ bg 1
    
  • 将后台任务召回前台:使用 fg 命令加任务编号,可以将后台任务重新接管回前台前置运行。
    crow@opsbox:~$ fg 1
    

特权执行与基本用户管理:sudo 与 passwd

作为管理员,我们很少直接以超级用户 root 身份登录系统,因为这会带来极高的操作风险(例如误删核心系统文件)。安全的做法是以普通用户登录,并在需要执行特权操作时使用特权分发机制。

超级用户特权执行:sudo

sudo 允许被授权的普通用户以超级用户(通常是 root)的权限来执行特定的管理命令。 例如,读取仅限管理员查看的 /etc/shadow 密码哈希文件:

crow@opsbox:~$ sudo cat /etc/shadow

执行后,系统会要求你输入当前用户自己的密码以确认身份。验证通过后,该命令会以 root 权限顺利执行。

修改个人密码:passwd

系统用户可以通过 passwd 命令随时修改自己的密码。普通用户修改自己密码时,系统会要求先输入旧密码:

crow@opsbox:~$ passwd

用户与组的基本增删(概念)

在 Linux 系统运维中,管理员可以通过以下指令对用户和用户组进行基础配置:

  • useradd / userdel:用于新建用户或删除用户账号及其家目录。
  • usermod:用于修改现有用户账户属性(例如将其加入某个特定的用户组)。
  • addgroup / delgroup:用于向系统添加或删除特定用户群组。