问题描述
这感觉像是一个超级具体的用例,但仍在寻找想法。
- 我正在一台返回大量结果的机器上运行
/usr/bin/security find-certificate -a -c $USER -Z -p /Library/Keychains/System.keychain
命令。 - 这会返回一个巨大的证书信息文件,但我想出了一种基于
-----BEGIN CERTIFICATE-----
拆分该文件的方法,并将这些证书中的每一个放入以单词cert
开头的单独文件中,例如 { {1}}、certaa
等等 - 然后我对工作目录中以单词
certbb
开头的任何文件运行 find 命令,这些文件应该是所有文件,然后对每个返回的文件运行 openssl x509 命令,如下所示:{ {1}} - 我正在将这些结果传递给 grep,因为我只需要查看带有“Not After”的信息,该信息告诉我证书的到期日期
- grep 的命令和管道工作并返回我正在查找的结果并显示行号,但它不返回找到结果的文件名。
我确实看到您可以包含应该显示文件名的 -H 或 cert
参数,但它没有,它只显示 find . -name "*cert" -type f -exec openssl x509 -text -noout -in {} \; | grep -n "Not After"
而不是文件名。我猜是因为它是 find 命令和返回结果的标准输入。我需要找到文件名,因为我需要知道哪个证书已过期以及我需要删除哪个证书。
希望超级复杂的解释有意义。基本上,我正在寻找一种方法让返回的结果显示 grep 结果返回的文件名,而不是标准输入。
解决方法
使用带有 find ... -exec
的复杂命令会很快变得混乱。如果文件都在一个目录中,那么使用这样的东西怎么样:
for certfile in cert*; do
openssl x509 -text -noout -in "$certfile" |
sed -n "/Not After/ s/^/$certfile:/p"
done
说明:由于循环的内容在完整的 shell 中运行(不仅仅是像 find -exec
那样简单的命令),您可以随意使用和操作变量 ($certfile
)。 sed
命令跳过打印大部分文件(-n
选项),但在包含“Not After”的行上,它将行的开头 (^
) 替换为文件名和一个冒号,然后打印该行。