我见过很多类似的问题,但没有答案。
基本上,我试图在 1000 个文件中 grep 硬编码私钥,以查找恶意文件并跳过合法文件,这些文件将此字符串定义为变量。所以我想匹配所有包含“BEGIN PRIVATE KEY-----”和 1x 或 0x CR 和行尾的文件。所以我尝试了各种 grep,但没有什么效果我预计这会起作用
# grep -iIREn "BEGIN PRIVATE KEY-----\r" /tmp/hck-bck/
grep: warning: stray \ before r
# grep -iIREn "BEGIN PRIVATE KEY-----" /tmp/hck-bck/
/tmp/hck-bck/style.php:123:$privateKey = '-----BEGIN PRIVATE KEY-----
# grep -iIREn "BEGIN PRIVATE KEY-----(\r)" /tmp/hck-bck/
grep: warning: stray \ before r
# grep -iIREn "BEGIN PRIVATE KEY-----[[:cntrl:]]" /tmp/hck-bck/
# grep -iIREn "BEGIN PRIVATE KEY-----[[:cntrl:]]?$" /tmp/hck-bck/
# grep -iIREn "BEGIN PRIVATE KEY-----.$" /tmp/hck-bck/
# grep -iIREn "BEGIN PRIVATE KEY-----$" /tmp/hck-bck/
# grep -iIREn 'BEGIN PRIVATE KEY-----[\r]' /tmp/hck-bck/
# grep -iIREn 'BEGIN PRIVATE KEY-----[[:cntrl:]]?$' /tmp/hck-bck/
# grep -iIREn "BEGIN PRIVATE KEY-----\\r" /tmp/hck-bck/
grep: warning: stray \ before r
#
因此,如果我在最后一个破折号 (-) 后什么都不放,那么就会有很多误报。
使用 [:cntrl:] 确实可以匹配,但它不会输出任何内容,因此我无法在日志中分辨出它是哪个文件。使用 '\r' 应该适用于 CR,但输出警告和不匹配。我试过单引号和双引号。如果我使用 -P 而不是 -E,也没有区别。使用 '\r' 实际上会匹配文字 \r,作为某些 php 文件中定义的字符串的一部分。
#cat -A style.php
....
}^M$
$privateKey = '-----BEGIN PRIVATE KEY-----^M$
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC30w49ItOfldQ6^M$
dB+0gEbeeW6BEClcx+NZzmpX2YcRHFV80BurCWBavPFehV8Sy9yL2u/y3mv3QJJ+^M$
x2kKvly8zKx4GbXPbsWJk6Ho0Rxq49oXkBarQBOqROZeaFF3Mzpd/PdLSsxEvG1M^M$
tQd2wOx5r6XD86jyfN7LAJUUVvbJvn1CHo03nFH12k1KYwLnQfzQI5nX7yQLa0jt^M$
fG5TA34Fm0EMbFdHWjAN/VdEjoJI6it4PCQP5wk4ga2BvVquQkuPbsbr8364d3I6^M$
GuGAKDR0wfkT20n0E6kAmDI3ol2bfa0rQncqUS3OU3INpxOZS8eKCIgC3bM81mdi^M$
MQ6TsAQ9AgMBAAECggEAJLGSlA2RpLdpx8lKUuOQQfSHZGfveb/E2DZl7+dSGM5J^M$
.............
因此文件有 CR 和行尾。为什么使用 [:cntrl:] 不会显示匹配的输出?以及如何在最后一个破折号后正确指定 CR 以获得匹配?
添加一些建议的输出
# grep -ERn $'BEGIN PRIVATE KEY-----\r?$' /tmp/hck-bck/
# grep -ERn $'BEGIN PRIVATE KEY-----.$' /tmp/hck-bck/
# grep -ERn $'BEGIN PRIVATE KEY-----' /tmp/hck-bck/
/tmp/hck-bck/style.php:123:$privateKey = '-----BEGIN PRIVATE KEY-----
#
使用
$'...'
以便在字符串中处理 C 样式的转义序列;这是转换\r
为 CR 字符所必需的。$
匹配行尾,并\r?
匹配其前的可选 CR 字符。--color=never
是为了避免输出颜色与打印 CR 字符之间出现交互问题。使用 GNU grep:
请参阅:
man grep
和 Stack Overflow 正则表达式常见问题解答