/etc/passwd 内容的正则表达式

/etc/passwd 内容的正则表达式

我在商店目录 (/store/) 中收集了来自企业中许多系统的文件,我想找到所有 passwd 文件并将它们放到一个文件中。直观地讲,我想到并使用的命令是:

find /store/ -name passwd -type f  -exec cat {} + > all_passwds.txt

但是这还会收集二进制文件 /etc/passwd 文件(我假设某些系统符号链接到 busybox 或类似的东西)。我真的只想要基于文本的 passwd 文件。

我的下一个想法是,也许我可以找到所有 /etc/passwd 文件并提取正则表达式匹配。我已经尝试了几个小时来创建一个与 passwd 格式匹配的正则表达式。

任何关于创建与 /etc/passwd 文件匹配的正则表达式或如何确保上述命令仅抓取文本 passwd 文件的帮助都将不胜感激。

答案1

如果您想使用正则表达式,那么^([^:]*:){6}[^:]*$匹配:每行以 分隔的七个字段可能就足够了,因此您可以执行以下操作:

find /store -name passwd -type f -exec grep -hIE '^([^:]*:){6}[^:]*$' {} + > all_passwds.txt
  • -h忽略输出中的文件名
  • -I跳过二进制文件
  • -E启用扩展正则表达式 (ERE)

答案2

首先:二进制文件很可能bin/passwd是密码更改工具……

passwd如果您想要的所有文件都在名为的子目录中etc,那么简单的解决方案可能会有效:

 find /store/ -wholename '*/etc/passwd'

这将仅查找etc/passwd以下文件:应该是正确的格式。

如果这不起作用,请使用file实用程序构建一个循环,并且仅当它是文本文件时才进行连接:

file /etc/passwd
   /etc/passwd: ASCII text

最后,我从一段旧的 PHP 代码中选取了以下正则表达式。根据需要进行调整:

\w+:\w+:\d+:\d+:[\w\d\s,@()]*:[\w\d\s\/]*:[\d\s\w\/]*

相关内容