我在商店目录 (/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\/]*