问题描述
TL;DR
我想以自动方式从 whois
的输出中提取提供者、范围开始、范围结束和提供者的名称,但该输出因提供者而异,因此我需要帮助提取这些任何提供商的三项信息。
详情
我有一个 IP 列表。我想在 whois 的帮助下为我的脚本检查每个 IP 的提供者,并想使用 MysqL 将其通过管道传输到数据库。
我想用提供者的 ipranges 填充 MysqL 表,但前提是提供者的范围已经存在。
即IP=187.187.187.187
whois $IP
然后获取 Providername 和段范围,但前提是我的表中还没有它
function ip2dec ...
function dec2ip ...
function awhois (){ ...
THEPROVIDER=$(whois $1 | grep PROVIDER) #<- i don't kNow how to grep
THERANGESTART=$(whois $1 | grep START) #<- i don't kNow how to grep
THERANGEENDING=$(whois $1 | grep END) #<- i don't kNow how to grep
}
while read line; do
DECIP=`ip2dec $line`
if [[ ! $(MysqL -u$THEUSER -p$PASSWORD -h$THEHOST -e "select iprangestart,iprangeend from $DATABASE.$TABLE where $DECIP BETWEEN iprangestart and iprangeend" 2>/dev/null) ]];
then
awhois $line
MysqL -u$THEUSER -p$PASSWORD -h$THEHOST -e
"INSERT INTO $DATABASE.$TABLE (iprangestart,iprangeend,provider)
VALUES ( \"$THERANGESTART\",\"$THERANGEENDING\",\"$THEPROVIDER\")" 2>/dev/null
fi
done < data/allips
但我真的不知道如何grep提供者和范围,因为它从提供者到提供者有不同的模式
解决方法
在 whois 的帮助下尝试了很多不同的方法来获取提供商名称后,我放弃了它。并尝试了 this。
我不得不使用 wget,因为 curl 没有给我任何有用的东西。
这是最终结果:
function ip2dec(){ # Convert an IPv4 IP number to its decimal equivalent.
declare -i a b c d;
IFS=. read a b c d <<<"$1";
echo "$(((a<<24)+(b<<16)+(c<<8)+d))";
}
while read ipadd; do
DECIP=`ip2dec $ipadd`
if [[ $(mysql -N -u$THEUSER -p$PASSWORD -h$THEHOST -e "select providername from $DATABASE.$TABLE where $DECIP >= providerrangestart and $DECIP <= providerrangeende" 2>/dev/null| wc -l) -eq 0 ]];
then
INET=$(whois $ipadd | egrep "inetnum")
NETRAN=$(whois $ipadd | egrep "netrange")
ISPP=`wget https://www.whoismyisp.org/ip/$ipadd 2>/dev/null`
THEPROVIDER=`cat $ISPP | grep -oP -m1 '(?<=isp">).*(?=</p)' | cut -c -31`
if [[ $(echo "$THEPROVIDER" | egrep -i 'D2VODAFONE|Arcor|Vodafone D2') ]]; then
THEPROVIDER="Vodafone GmbH"
elif [[ $(echo "$THEPROVIDER" | egrep -i "Telefonica|Telefonica O2") ]]; then
THEPROVIDER="Deutsche Telekom AG"
elif [[ $(echo "$THEPROVIDER" | egrep -i "1&1 Versatel Deutschland GmbH|1&1 Internet SE") ]]; then
THEPROVIDER="1&1 GmbH"
fi
if [[ $INET ]];then
echo "new dump"
THERANGESTART=`echo $INET | awk '{print $2}'`
DECRANGESTART=`ip2dec $RANGESTART`
echo "Rangestart: $DECRANGESTART"
RANGEEND=`echo $INET | awk '{print $4}'`
DECRANGEEND=`ip2dec $RANGEEND`
echo "Rangeend: $RANGEEND"
echo "Provider: $THEPROVIDER"
echo ""
mysql -u$THEUSER -p$PASSWORD -h$THEHOST -e "INSERT INTO $DATABASE.$TABLE (providerrangestart,providerrangeende,providername) VALUES ( \"$DECRANGESTART\",\"$DECRANGEEND\",\"$THEPROVIDER\")" 2>/dev/null
elif [[ $NETRAN ]]; then
echo "new dump"
THERANGESTART=`echo $NETRAN | awk '{print $2}'`
DECRANGESTART=`ip2dec $RANGESTART`
echo "Rangestart: $RANGESTART"
RANGEEND=`echo $NETRAN | awk '{print $4}'`
DECRANGEEND=`ip2dec $RANGEEND`
echo "Rangeend: $RANGEEND"
echo "Provider: $THEPROVIDER"
echo ""
mysql -u$THEUSER -p$PASSWORD -h$THEHOST -e "INSERT INTO $DATABASE.$TABLE (providerrangestart,\"$THEPROVIDER\")" 2>/dev/null
else
echo "Failed to optain ISP and IP-Range"
echo -e "$ipadd \n"
fi
rm $ipadd
fi
done < data/allips
rm data/allips