我想检查一下iptables规则是否存在(如此处所示),但是出现了以下错误:
$ sudo iptables-save | grep "-A OUTPUT -p tcp --tcp-flags RST RST -j DROP"
grep: OUTPUT -p tcp --tcp-flags RST RST -j DROP: invalid context length argument
也许我需要转义一些字符?
grep "-A OUTPUT -p tcp --tcp-flags RST RST -j DROP"
使用许多shell工具时,有些参数可能会被误认为是标志。根据您的grep版本,以下内容将帮助grep了解“flags”实际上不是标志,而是您要搜索的表达式的一部分。
例如,请考虑:
$ echo "-Afoo" | grep "-Afoo"
grep: Invalid argument
使用特殊的 --
标志表示没有跟随的标志。
grep -- "-A OUTPUT -p tcp --tcp-flags RST RST -j DROP"
使用 -e
标志来明确标识引用的文本作为要搜索的表达式。 grep -e "-A OUTPUT -p tcp --tcp-flags RST RST -j DROP"
对于我来说,这种方法在使用BSD grep时都有效。请考虑以下示例:
$ echo "-Afoo" | grep -- "-Afoo"
-Afoo
$ echo "-Afoo" | grep -e "-Afoo"
-Afoo
虽然这些示例被承认是人为构造的,但它们更清楚地说明了问题(和解决方案),并且可以在没有iptables作为输入文本的系统上轻松测试。
grep
将-A
视为参数而不是模式。您需要使用-e "..."
。 - Etan Reisner