我的 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
#-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
选项。如果结果看起来正确,您可以将其放回去。
切向也许还可以看到无用地使用和计数行或枚举行号,以便我可以循环它们 - 为什么这是一个反模式?