在 sed 中使用命令

问题描述 投票:0回答:1

我的 bash 脚本需要一些帮助。 我编写了一个仅

grep
规则的脚本。
ssh

输出由 IP1 和 IP2 的规则组成

#!/bin/bash FILE=/path/to/file.txt IP=`grep -Eiw "22?" $FILE | grep -Eiw "SSHBRUTE?" | sed "/IP3/d" ` for name in "$IP"; do if [ -z "$IP" ] ; then do something else echo "$IP" fi done

我想注释掉 IP1 和 IP2 的行,但不注释掉 IP3 和其他行。如果我要添加行 echo "$IP" > $FILE 那么它只是文件的重写。

例如,使用命令就可以轻松制作

-A INPUT -s IP1 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j SSHBRUTE -A INPUT -s IP2 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j SSHBRUTE

如何让 $IP 在 
sed -e '/192.168.1.1/s/^/#/g' -i $FILE

内输出?

输出必须如下

sed

	
bash sed
1个回答
0
投票
#-A INPUT -s IP1 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j SSHBRUTE #-A INPUT -s IP2 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j SSHBRUTE -A INPUT -s IP3 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j SSHBRUTE ........ some rules else -A INPUT -p tcp -m multiport --dports 80,443 -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j RATE-LIMIT

脚本,保持其他行不变,只修改您想要匹配的行。

sed

换句话说,如果当前行不匹配22,或者不匹配
sed -e '/\<22\>/!b' \ -e '/\<[Ss][Ss][Hh][Bb][Rr][Uu][Tt][Ee]/>/!b' \ -e '/IP3/b' -e 's/^/#/' "$FILE"

,或者包含IP3,则不要管它。 (

SSHBRUTE
表示“不”,
!
表示“跳过当前输入行的脚本的其余部分。”)
我假设您的 

b

sed
\<
识别为单词边界。如果没有,请尝试
\>
、或
\b
[:[<]:]
尚不清楚您希望 

[:[>]:]

在这里做什么。这似乎纯粹是一个错误,所以我把它省略了。根据记录,

?
使第二个
22?
可选,因此它匹配
2
2
我还遗漏了 

22

选项。如果结果看起来正确,您可以将其放回去。

切向也许还可以看到

无用地使用

-i

计数行或枚举行号,以便我可以循环它们 - 为什么这是一个反模式?

© www.soinside.com 2019 - 2024. All rights reserved.