我正在尝试搜索明文私钥。简单搜索“BEGIN.*PRIVATE”会返回许多误报,因为许多都以以下格式加密存储:
-----BEGIN ... PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
所需的输出是包含明文私钥的所有文件名的列表。文件中有多少个,或者每个文件出现的频率,是我之后要处理的问题。
我有一个非常丑陋、脆弱得令人讨厌的解决方案:
for i in $(find temp_git/ -type f) ; do sed -n '/BEGIN.*PRIVATE/ {N ; /ENCRYPTED/!p}' "${i}" | sed -E "s#.*#${i} : Plaintext PK#" | sort -u 2>/dev/null ; done
由于最后一个 sed 语句中引用路径不足,这在各种文件名上都失败了,我不愿意在明显次优的解决方案上投入更多时间。肯定可以用 sed 简洁地做到这一点,但由于未能与 awk 一起破解任何有用的东西,我会对 *awk 解决方案非常感兴趣(使用 awk,我想我也可以在子 shell 中删除 'for i。 ..').
Perl 来拯救!
find temp_git -exec perl -lne '
print $ARGV if /BEGIN.*PRIVATE/ and readline !~ /ENCRYPTED/
' {} +
-l
从 Perl 的输入中删除换行符并将它们添加到 print
;-n
逐行处理输入,运行每一行的代码;$ARGV
包含当前打开文件的名称;!~
否定与/ENCRYPTED/
的匹配。这可能对你有用(GNU sed):
sed -n '/BEGIN.*PRIVATE/{N;/\n.*ENCRYPTED/!F;D}' file
使用选项
-n
关闭隐式打印。
如果一行包含
BEGIN
,然后是PRIVATE
,则追加下一行。
如果附加行不包含
ENCRYPTED
,则输出文件名。