Linux

/etc/passwd 內容的正則表達式

  • June 23, 2019

我在儲存目錄 (/store/) 中有一個來自企業中許多系統的集合文件,我想找到所有 passwd 文件並將它們分類到一個文件中。直覺地說,我想出並使用的命令是:

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

但這也收集了作為二進製文件的 /etc/passwd 文件(我假設某些系統符號連結到 busybox 或其他東西)。我真的只想要基於文本的 passwd 文件。

我的下一個想法是,也許我可以找到所有 /etc/passwd 文件並提取正則表達式匹配項。我已經嘗試了幾個小時來創建一個匹配 passwd 格式的正則表達式。

對於創建匹配 /etc/passwd 文件的正則表達式或如何確保上面的命令僅獲取文本 passwd 文件的任何幫助將不勝感激。

如果您想使用正則表達式,則^([^:]*:){6}[^:]*$可能足以匹配:每行分隔的七個欄位,因此您可以這樣做:

find /store -name passwd -type f -exec grep -hIE '^([^:]*:){6}[^:]*$' {} + > all_passwds.txt
  • -h省略輸出中的文件名
  • -I跳過二進製文件
  • -E啟用擴展正則表達式 (ERE)

第一:二進製文件很可能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\/]*

引用自:https://serverfault.com/questions/972572