0

我有一个解析清漆 varnishncsa 日志文件的脚本。该脚本的目的是,如果有人访问服务器上的某个 url,它会将他们的 ip 地址添加到 iptables 以将其锁定。

在我的脚本中,我有一个忽略我的静态办公室 IP 地址的语句(这样我就不会将自己锁定在服务器之外)。

我正在尝试添加更多 ip 地址以将它们排除在外,但是当我这样做时,它似乎破坏了脚本。

#!/bin/bash


for address in `cat /var/log/brute.txt | grep -v -f /var/log/applied_brute.txt`; do
/bin/echo $address >> /var/log/applied_brute.txt

if [ "$address" != "my.of.fi.ce.ip" ]; then
IPTABLE=`echo $address | awk '{ print "/sbin/iptables -A INPUT -s "$0" -j DROP -m state --state NEW,ESTABLISHED,RELATED\n"}'`
fi


echo $IPTABLE
$IPTABLE
done


unset address
unset IPTABLE

我想要的是声明在哪里

if [ "$address" != "my.of.fi.ce.ip" ]; then

向它添加更多的IP地址。

4

4 回答 4

1

你可以使用greporfgrep并且有

 if fgrep -q "$address" /etc/files-of-addresses-to-avoid ; then
   # $address should be avoided
 else
   # $address should not be avoided
 fi

(也许你想要/var/log/brute.txt而不是/etc/files-of-addresses-to-avoid等......)

您可能对fail2ban感兴趣,它可以实现您想要实现的目标。

于 2013-07-05T05:48:25.000 回答
1

怎么样:

#!/bin/bash

for address in `grep -v -f /var/log/applied_brute.txt < /var/log/brute.txt`; do
    echo $address >> /var/log/applied_brute.txt
    if ! grep -q -F -x $address /etc/my-office-addresses.txt; then
        IPTABLE="/sbin/iptables -A INPUT -s "$address" -j DROP -m state --state NEW,ESTABLISHED,RELATED"
        echo $IPTABLE
        $IPTABLE
    fi
done

将您的办公地址存储在/etc/my-office-addresses.txt

使用的 grep 选项:

-F : Fixed strings (treat pattern literally, not as regex. This option is not really required in this case, since the input data in all the files used is assumed to be in standard format.)
-x : line match (address = 192.168.0.1 would have matched line = 192.168.0.100 , if this option is missed.)
-q : Do not print result to stdout.
于 2013-07-05T06:27:58.537 回答
1

如果您的 IP 地址数量非常有限,您可以使用 AND:

if [ "$address" != "my.of.fi.ce.ip" -a "$address" != "my.other.of.fi.ce.ip" -a "$address" != "my.la.st.ip" ]; then
于 2013-07-05T06:52:46.443 回答
0

如何创建一个本地 IP 地址数组,然后在内部“for 循环”中遍历它们。

于 2013-07-05T05:50:11.863 回答