You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Bash脚本跨Linux服务器捕获sudo文件中的多行命令列表?

捕获sudo文件中多行续接的命令列表

我需要通过Bash脚本跨多台Linux服务器捕获sudo文件中特定格式的命令列表。目标文本格式如下:

Cmnd_XXXX Alias = /path/to/command/ command,
/path/to/command/2 command,
/path/to/command/3 command,
/path/to/command/4 command,
/path/t/command/5 command

目前我用grep -A 6来捕获首行及后续6行,但不同服务器的命令数量不固定,想知道如何自动捕获所有以反斜杠换行续接的内容,直到最后一条命令。

方法1:用sed匹配并合并续行

直接用sed处理续行,提取并格式化命令列表:

sed -n '/Cmnd_.*Alias =/{:a;N;/\\$/ba;s/.*Alias = //;s/\\\n//g;s/, /\n/g;p}' /etc/sudoers
  • 工作逻辑:
    1. 定位到以Cmnd_开头且包含Alias =的起始行
    2. 循环读取后续行,直到遇到不以反斜杠结尾的行
    3. 删除起始行的前缀Cmnd_XXXX Alias =
    4. 去掉所有续行用的反斜杠和换行符
    5. 把逗号分隔的命令拆分成每行一个,输出结果

方法2:用awk处理续行拼接

awk可以精准识别续行标记,合并后再拆分命令:

awk '/Cmnd_.*Alias =/{flag=1;sub(/.*Alias = /,"")} flag{printf "%s",$0;if(!/\\$/) {flag=0;print ""}}' /etc/sudoers | tr ',' '\n' | sed 's/^ //'
  • 工作逻辑:
    1. 匹配到目标起始行后,开启处理标记并删除前缀
    2. 标记开启时,逐行拼接内容,直到遇到不带反斜杠的结束行
    3. 用tr把逗号换成换行,sed去掉每行开头的空格,得到整洁的命令列表

方法3:用grep的PCRE多行匹配(需grep支持-P)

如果你的grep支持PCRE模式,用单行匹配的方式一次性捕获所有内容:

grep -Pzo 'Cmnd_.*Alias = \K(.*?\\\n)*.*' /etc/sudoers | tr '\\\n' ' ' | tr ',' '\n' | sed 's/^ //;s/ $//'
  • 工作逻辑:
    1. -z将文件视为单行文本,-o只输出匹配部分,\K忽略前面的前缀内容
    2. 匹配所有以反斜杠续行的内容直到最后一行
    3. 用tr清理续行标记和逗号,sed去掉多余的首尾空格,拆分出每行一个命令

内容的提问来源于stack exchange,提问作者Mogwuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:23:26