grep: 无效的上下文长度参数

7

我想检查一下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

也许我需要转义一些字符?

2
grep-A 视为参数而不是模式。您需要使用 -e "..." - Etan Reisner
那个有效了,谢谢! - Ricky Robinson
1
@EtanReisner 如果您将此作为答案发布,Ricky就可以接受它作为答案。 - Anthony Geoghegan
1
@AnthonyGeoghegan 我知道。我也知道这是一个经常出现的问题,我真的不想再为它写另一个答案了。我很想有一个好的重复问题解答,但我还没有找到(尽管我刚刚找到了一个)。 - Etan Reisner
2
重复的问题:https://dev59.com/gl8e5IYBdhLWcg3wucRT - Etan Reisner
1个回答

11

问题

grep "-A OUTPUT -p tcp --tcp-flags RST RST -j DROP"

使用许多shell工具时,有些参数可能会被误认为是标志。根据您的grep版本,以下内容将帮助grep了解“flags”实际上不是标志,而是您要搜索的表达式的一部分。

例如,请考虑:

$ echo "-Afoo" | grep  "-Afoo"
grep: Invalid argument

解决方案

标记表达式的标志

  1. 使用特殊的 -- 标志表示没有跟随的标志。

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作为输入文本的系统上轻松测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接