如何通过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
- 工作逻辑:
- 定位到以
Cmnd_开头且包含Alias =的起始行 - 循环读取后续行,直到遇到不以反斜杠结尾的行
- 删除起始行的前缀
Cmnd_XXXX Alias = - 去掉所有续行用的反斜杠和换行符
- 把逗号分隔的命令拆分成每行一个,输出结果
- 定位到以
方法2:用awk处理续行拼接
awk可以精准识别续行标记,合并后再拆分命令:
awk '/Cmnd_.*Alias =/{flag=1;sub(/.*Alias = /,"")} flag{printf "%s",$0;if(!/\\$/) {flag=0;print ""}}' /etc/sudoers | tr ',' '\n' | sed 's/^ //'
- 工作逻辑:
- 匹配到目标起始行后,开启处理标记并删除前缀
- 标记开启时,逐行拼接内容,直到遇到不带反斜杠的结束行
- 用
tr把逗号换成换行,sed去掉每行开头的空格,得到整洁的命令列表
方法3:用grep的PCRE多行匹配(需grep支持-P)
如果你的grep支持PCRE模式,用单行匹配的方式一次性捕获所有内容:
grep -Pzo 'Cmnd_.*Alias = \K(.*?\\\n)*.*' /etc/sudoers | tr '\\\n' ' ' | tr ',' '\n' | sed 's/^ //;s/ $//'
- 工作逻辑:
-z将文件视为单行文本,-o只输出匹配部分,\K忽略前面的前缀内容- 匹配所有以反斜杠续行的内容直到最后一行
- 用
tr清理续行标记和逗号,sed去掉多余的首尾空格,拆分出每行一个命令
内容的提问来源于stack exchange,提问作者Mogwuy
相关产品推荐
相关产品推荐

