继文件权限和用户管理之后,我们继续学习 Linux 系统中非常实用的进阶命令:如何为普通用户授权 sudo 权限、如何使用 find 命令灵活查找文件、以及如何利用管道符和文本处理工具(wcgrep)高效处理数据。这些技能将极大提升你的日常工作效率。

前言

在日常的 Linux 使用和运维中,我们经常需要以普通用户执行特权命令、快速查找特定文件、统计日志行数、筛选文本内容,或者实时监控进程、按名称终止进程。这些操作看似零散,却是系统管理和故障排查的核心技能。

本文从 sudo 授权配置开始,带你掌握 find 的多条件文件查找、管道符 | 的组合技巧、grepwc 的文本处理,最后深入进程管理:用 top 动态监控系统、用 pgrep 快速定位进程 PID、用 pkillkill 按需终止进程。

一、sudo:让普通用户执行特权命令

1.1 为什么需要 sudo

在 Linux 中,很多系统管理操作(如安装软件、修改配置文件、重启服务)需要 root 权限。但直接使用 root 用户登录存在安全风险。sudo 允许普通用户在需要时临时获得 root 权限,执行特定命令。

1.2 授权配置:visudo

重要sudo 的授权文件是 /etc/sudoers必须使用 visudo 命令编辑,不能直接用 vimnano,因为 visudo 会进行语法检查,避免配置错误导致无法使用 sudo

  • 命令格式:sudo visudo

  • 也可以编辑 /etc/sudoers.d/ 下的独立文件:sudo visudo -f /etc/sudoers.d/文件名

1.3 常见授权规则格式

规则 含义
用户名 ALL=(ALL) ALL 该用户可以在任何主机上以任何用户身份执行任何命令
%组名 ALL=(ALL) ALL 该组中的所有成员拥有完整 sudo 权限(组名前加 %
用户名 ALL=(ALL) NOPASSWD: 命令路径 该用户可以免密码执行指定命令

里面出现了三个 ALL,它们分别代表不同的含义。按顺序解释:

位置 示例 含义
第一个 ALL tony ALL =(ALL) ALL 主机名匹配:表示该规则适用于所有主机。在多机环境中,你可以指定特定主机名,但通常用 ALL 表示不限制主机。
括号内的 ALL tony ALL=(ALL) ALL 用户身份匹配:表示允许以任何用户的身份执行命令(即可以通过 sudo -u 用户名 切换成其他用户)。如果写成 =(root),则只能以 root 身份执行。
最后一个 ALL tony ALL=(ALL) ALL 命令匹配:表示允许执行任何命令。你可以替换成具体命令路径(如 /bin/systemctl restart nginx),来限制只能执行特定命令。

这个括号里面的ALL可以省略的,省略后表示不允许以任何用户的身份执行命令,只允许以root身份执行。

完整解读

tony ALL=(ALL) ALL 的意思是:

用户 tony 可以在任何主机上,以任何用户的身份,执行任何命令。

我们输入了sudo visudo命令后成功跳转到了编辑页面,可以看到里面很多#开头的,这些都是注释,我们可以不管,我这里只截取了一点,下面其实有其他的授权,可以翻看一下,下面我们试试给kunkun用户授权。只需要找到一个空白位置按照语法要求写入就可以了,这个和vim很像,用法也是一样的,也涉及到了三种模式的切换,但是这个文件的编辑只能使用visudo。

我随便找了一篇空白位置输入了授权,表示授予kunkun用户在所有主机上允许使用root权限进行所有操作(这里我省略了括号中的ALL),输入完授权后和vim操作一样,按esc退出到默认模式,然后输入:进入命令模式,再输入wq保存并退出,这样就完成了授权。

1.4 使用 sudo

  • 在需要提权的命令前加上 sudo,例如 sudo systemctl restart sshd

  • 切换到被授权的用户

  • 以其他用户身份执行命令:sudo 命令

我们刚刚给kunkun用户给授权了sudo,下面我们来切换到kunkun用户,然后我们试试能不能在/root目录下创建目录,我们先来试试不使用sudo,看看能不能在/root目录下创建目录。我们来分析一下,这个/root目录是root用户的家目录,我们执行ls -ld /root命令来查看一下权限然后试试不用sudo来创建目录。

/root目录是root用户的家目录,他的属主是root,属组是root,那么kunkun用户对于这个文件来说就是其他用户,执行完ls -ld /root命令后,可以看到其他用户是没有任何权限的,所以我们分析,不使用sudo不能创建出目录,从截图中可以看出,我们没有使用sudo,确实是未能成功创建目录,显示权限不够。下面我们再来加上sudo试试能否成功创建目录。

加上sudo后执行命令发现并没有报错,这里第一次使用sudo会让输入当前用户的密码,如果没有设置密码需要返回设置密码,我已经执行过了就不用输入密码,然后使用ls -l /root命令查看是否真的创建出来了,可以看到,是成功创建出了这个目录的,我们看看前面,发现属主和属组都是root而不是这个kunkun用户,说明我们是成功使用了sudo的,以为root用户身份创建出了这个目录。

学到这里,不难想到这个sudo应该常常被攻击者用作建立后门,只要拿到一次root后攻击者就可以给普通用户授权sudo,这样就算以后拿不到root了也可以通过普通用户执行sudo拿到root权限。之前我们还提到过SUID后门,这个sudo后门相较于SUID后门就更加隐蔽持久,而SUID后门容易被我们下面讲到的find命令查询到。


二、find:强大的文件查找工具

find 命令可以在指定目录中递归搜索文件,并支持多种条件组合。

基本格式find [搜索路径] [条件] [动作]

2.1 常用查找条件

参数 作用 用法说明
-name 按文件名查找 支持通配符,通配符需加引号。例如查找所有 .conf 文件
-type 按文件类型 f(普通文件)、d(目录)、l(符号链接)
-user / -group 按属主或属组查找 例如查找属于用户 root 的所有文件
-size 按大小查找 +100M(大于100MB)、-1k(小于1KB)
-mtime 按修改时间 -mtime n(n 天前当天修改)、+n(超过 n 天)、-n(n 天内)
-perm 按权限查找 例如查找权限为 755 的文件,或查找设置了 SUID 的文件(-perm 4755
  • -name参数可以对文件名进行查找,支持使用通配符,下面是查找出根目录下所有以.conf结尾的文件,这里文件太多了,我就用 | (这是管道符,在文章后面会讲到)只展示了前五个。可以看到成功按照要求筛选出了文件。
  • -type 参数可以指定文件的类型 ,f 代表普通文件 ,d表示目录,l表示链接。下面我们使用这个参数来找出/etc目录下的所有文件,我们还是使用管道符只展示前五个,使用ls命令查看其中一个,发现这确实是一个文件。
  • -user/group可以以属主/属组为条件筛选出所有属主/属组为该用户的文件或者目录,这些筛选都是可以自由组合的,我们可以再加上-type f筛选出所有符合条件的文件,选择其中一个使用ls命令查看,确实是符合筛选条件的。
  • -size参数可以查询出符合大小要求的目录或者文件,+表示大于、-表示小于,我们来试试查找出根目录下大于10G的文件,执行命令后成功查询到了,使用ls命令查看,发现大小128T,大于10G,当然这是虚拟的,实际并没有这么大。
  • -mtime可以根据时间查询,比如某些日志文件,等保要求的一般是保存半年以上,所以我们可以筛选出超过一年的文件,我们还是使用管道符只展示了前十个,我们挑选了一个使用ls命令查看,确实是符合条件的。
  • perm参数可以按照权限进行查询,之前我们提到过SUID后门可以被find查询到,就是通过这个参数查询,我们执行命令就可以查到具有s权限的文件,所以说这个隐蔽性不如sudo后门高。

2.2 组合条件

  • -a(与,可省略):多个条件必须同时满足。

  • -o(或):满足任一条件即可。


三、管道符 | 与文本处理

3.1 管道符 | 的作用

管道符将左边命令的标准输出作为右边命令的标准输入,实现命令组合。右边命令必须能处理文本(如 grepwcsortheadtailcat 等)。

3.2 wc -l:统计行数

  • 直接统计文件行数:wc -l 文件名

  • 通过管道统计:其他命令 | wc -l

  • 常见用途:统计登录用户数、统计文件数量、统计日志行数等。

之前我们查询.conf结尾的文件的时候有很多很多,现在我们可以使用这个管道符来查询到底有多少条。

执行完命令可以看到,以.conf结尾的有1646行之多,这也印证了管道符将左边命令的标准输出作为右边命令的标准输入的作用

3.3 grep:文本搜索

grep 用于在文件或输入流中搜索匹配模式的行。

常用选项

选项 作用
-i 忽略大小写
-v 反向匹配(显示不包含模式的行)
^ 锚定行首,例如 ^root 表示以 root 开头的行
$ 锚定行尾,例如 bash$ 表示以 bash 结尾的行
^$ 匹配空行

常见用法

  • 在日志中搜索包含某个关键词的行(不区分大小写)
  • 过滤掉配置文件中的注释行和空行,visudo文件中就有很多注释,我们只需要反向查找以#开头的并且反向查找^$就可以了,通过命令我们成功查询到了,原本是有很多注释的,现在都没有了。
  • 查找以特定字符串开头的行,查找以什么开头的就只需要再前面加上^就可以,可以看到我们成功查询出了符合条件的一行。

  • 查找以特定字符串结尾的行,这个也只需要再要查询的字段后面加上$就可以了,我们也成功查询到了以bash结尾的。

四、进程管理:toppgrep

4.1 top:实时查看系统进程

top 是一个动态、实时的系统监控工具,可以查看进程的 CPU、内存占用情况,以及系统负载。

基本用法:直接输入 top 进入交互界面。

常用交互命令(在 top 界面中按下对应按键):

按键 作用
1 展开/折叠每个 CPU 核心的使用率
P 按 CPU 使用率降序排列(大写 P)
M 按内存使用率降序排列(大写 M)
k 杀死进程(输入 PID 和信号)
q 退出 top

执行命令后可以详细看到各个进程的情况注意这个top命令查看的是动态显示的,他会不断变化,实时显示。下面是总结出来的核心指标。

区域 指标 含义 什么时候看
第1行 load average 系统负载(1/5/15分钟平均活跃进程数) 感觉系统卡顿、响应慢时,看负载是否超过 CPU 核心数
第3行 us(用户CPU) 用户进程占用的 CPU 百分比 高说明应用在忙(正常)
sy(系统CPU) 内核占用的 CPU 百分比 高说明内核操作频繁(可能驱动或系统调用问题)
id(空闲CPU) 空闲 CPU 百分比 低说明 CPU 忙,高说明空闲
wa(等待I/O) 等待磁盘/网络 I/O 的时间 高说明磁盘慢或读写频繁
第4行 used / free 已用/空闲物理内存 内存不足时 used 接近 total,free 很小,系统可能开始用 swap
进程列表 %CPU 进程占用 CPU 比例 找出哪个进程占用 CPU 过高
%MEM 进程占用内存比例 找出哪个进程占用内存过高
RES 进程实际使用的物理内存 比 VIRT 更真实(VIRT 包含未分配的虚拟内存)
S(状态) R(运行)、S(睡眠)、Z(僵尸) 发现大量 ZD 状态需要关注
COMMAND 进程名 识别是哪个程序

4.2 pgrep:按名称查找进程 PID

pgrep 根据进程名(或正则表达式)查找对应的进程 ID,比 ps | grep 更简洁高效。

命令格式pgrep [选项] 进程名

常用选项

选项 作用
-l 同时显示进程名和 PID
-f 匹配完整命令行(包括参数)
-u 用户名 只查找属于指定用户的进程
-x 精确匹配进程名(而不是部分匹配)
-a 显示完整命令行

示例

# 只显示 ssh 相关进程的 PID
pgrep ssh
# 显示 ssh 相关进程的 PID 和进程名
pgrep -l ssh
# 查找以 ssh 开头的完整命令行(如 ssh 隧道)
pgrep -f "ssh -L"
# 查找用户 alice 的 bash 进程
pgrep -u alice bash

我们可以用pgrep -l "ssh"来查看包含ssh 的字段名这样就可以精确查找出来。

执行命令后查找出了所有带有ssh字段的进程,这个sshd进程就是开启远程连接的进程。

4.3 pkill:按名称杀死进程

pkillpgrep 的“兄弟”命令,用于根据进程名(或其他属性)直接发送信号终止进程,而不需要先查找 PID 再用 kill

基本用法

pkill 进程名

默认发送 TERM(15)信号,请求进程正常退出。

常用选项

选项 作用
-f 匹配完整命令行(包括参数)
-u 用户名 只杀死指定用户的进程
-x 精确匹配进程名(不是部分匹配)
-信号 指定信号(如 -9-KILL
-l 列出所有可用信号名称(不杀进程)

示例

# 杀死所有名为 ssh 的进程(正常终止)
pkill ssh
# 强制杀死所有名为 firefox 的进程
pkill -9 firefox
# 杀死用户 alice 的所有 bash 进程
pkill -u alice bash
# 杀死完整命令行中包含 "ssh -L 8888" 的进程
pkill -f "ssh -L 8888"

kill 的区别

命令 操作对象 优点
kill PID 需要先找到进程 PID 精确控制单个进程
pkill 进程名 直接按名称匹配 批量操作,无需查找 PID

注意事项

  • pkill 会匹配所有包含该名字的进程(例如 pkill ssh 也会杀死 ssh-agent),建议先用 pgrep -l 确认匹配范围。

  • 使用 -9 信号强制杀死时,进程不会收到清理机会,可能导致数据丢失或资源未释放。

我们可以来试试结束ssh进程。

执行完命令后可以看到,moba直接就断开连接了,ssh进程是远程连接,所以断开连接了。说明ssh进程被成功终止了。


四、小结

本文系统梳理了 Linux 中极为实用的几类进阶命令:

  • 特权授权sudo 与 visudo,让普通用户安全执行高权限命令。

  • 文件查找find 支持按名称、类型、大小、时间、权限等组合条件查找,配合 -exec 可批量操作。

  • 文本处理:管道符 | 连接命令,grep 灵活搜索(忽略大小写、反向匹配、行首行尾定位),wc -l 统计行数。

  • 进程管理top 实时监控系统负载与进程资源;pgrep 按名称快速获取 PID;pkill 按名称批量终止进程;kill 精确控制单个进程(-9 强制杀死)。


原创作者:浅了

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐