纯真ip数据库的perl。

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

纯真ip数据库的perl。

#1

帖子 eexpress » 2008-03-10 23:52

ipwhere函数部分,完全是别人的改的。别找我版权。我乱找的。
加到opera菜单的,不要我说了吧。很多例子了。

代码: 全选

☎  cat ip.pl 
#!/usr/bin/perl -w

use strict;

sub ipwhere {
#        my $ipbegin,$ipend,$ipData1,$ipData2,$DataSeek,$ipFlag;
        my $ipbegin;
        my $ipend;
        my $ipData1;
        my $ipData2;
        my $DataSeek;
        my $ipFlag;

        my $ipAddr1;
        my $ipAddr2;

        my $ip=$_[0]; #"59.33.209.104"; #shift;
        my @ip=split(/\./,$ip);
        my $ipNum = $ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3];

        my $ipfile="./QQWry.Dat";
        open(FILE,"$ipfile");
        binmode(FILE);
        sysread(FILE,$ipbegin,4);
        sysread(FILE,$ipend,4);
         $ipbegin=unpack("L",$ipbegin);
         $ipend=unpack("L",$ipend);
        my $ipAllNum = ($ipend-$ipbegin)/7+1;

        my $BeginNum=0;
        my $EndNum=$ipAllNum;

        Bgn:
        my $Middle= int(($EndNum+$BeginNum)/2);

        seek(FILE,$ipbegin+7*$Middle,0);
        read(FILE,$ipData1,4);
        my $ip1num=unpack("L",$ipData1);
        if ($ip1num > $ipNum) {
                $EndNum=$Middle;
                goto Bgn;
        }

        read(FILE,$DataSeek,3);
        $DataSeek=unpack("L",$DataSeek."\0");
        seek(FILE,$DataSeek,0);
        read(FILE,$ipData2,4);
        my $ip2num=unpack("L",$ipData2);
        if ($ip2num < $ipNum) {
                goto nd if ($Middle==$BeginNum);
                $BeginNum=$Middle;
                goto Bgn;
        }

        $/="\0";
        read(FILE,$ipFlag,1);
        if ($ipFlag eq "\1") {
                my $ipSeek;
                read(FILE,$ipSeek,3);
                $ipSeek = unpack("L",$ipSeek."\0");
                seek(FILE,$ipSeek,0);
                read(FILE,$ipFlag,1);
        }
        if ($ipFlag eq "\2") {
                my $AddrSeek;
                read(FILE,$AddrSeek,3);
                read(FILE,$ipFlag,1);
                if($ipFlag eq "\2") {
                        my $AddrSeek2;
                        read(FILE,$AddrSeek2,3);
                        $AddrSeek2 = unpack("L",$AddrSeek2."\0");
                        seek(FILE,$AddrSeek2,0);
                }
                else {
                        seek(FILE,-1,1);
                }
                $ipAddr2=<FILE>;
                $AddrSeek = unpack("L",$AddrSeek."\0");
                seek(FILE,$AddrSeek,0);
                $ipAddr1=<FILE>;
        }
        else {
                seek(FILE,-1,1);
                $ipAddr1=<FILE>;
                read(FILE,$ipFlag,1);
                if($ipFlag eq "\2") {
                        my $AddrSeek2;
                        read(FILE,$AddrSeek2,3);
                        $AddrSeek2 = unpack("L",$AddrSeek2."\0");
                        seek(FILE,$AddrSeek2,0);
                }
                else {
                        seek(FILE,-1,1);
                }
                $ipAddr2=<FILE>;
        }

        nd:
        chomp($ipAddr1,$ipAddr2);
        $/="\n";
        close(FILE);

        $ipAddr2="" if($ipAddr2=~/http/i);
        my $ipaddr="$ipAddr1 $ipAddr2";
        $ipaddr =~ s/CZ88\.NET//isg;
        $ipaddr="未知地区" if ($ipaddr=~/未知|http/i || $ipaddr eq "");
        return $ipaddr;
}
sub cv {
        open(CV, "|/usr/bin/enconv") or warn("No find enconv.p\n"),
                return;
        print CV $_[0];
        close CV;
}


my $ipnow=ipwhere("${ARGV[0]}");
cv($ipnow);
print "\n";

● 鸣学
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#2

帖子 eexpress » 2008-03-10 23:53

加libnotify的。也有现成的例子。别找我。
● 鸣学
aBiNg
帖子: 1331
注册时间: 2006-07-09 12:22
来自: 南京
送出感谢: 0
接收感谢: 2 次

#3

帖子 aBiNg » 2008-03-11 9:00

嗯,强大的perl,强大的ee。 :D
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

#4

帖子 bones7456 » 2008-03-11 9:07

:lol: 不错啊
关注我的blog: ε==3
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

#5

帖子 yaoms » 2008-03-11 9:14

凑个份子,和你的功能一样,不过我投机取巧了,用ip138的结果的。。

代码: 全选

$ cat python/ipaddress.py 
#!/usr/bin/env python
from sys import argv
import urllib
import re

str_url='http://www.ip138.com/ips.asp'

if len(argv) != 2:
  print 'USAGE: %s IP_OR_HOSTNAME' % (argv[0])
  exit(0)

host=argv[1]

param=urllib.urlencode({'ip':host, 'action':'2'})

try:
  httpsock=urllib.urlopen(str_url, param)
  data=httpsock.read()
except:
  print 'Some error!! '

#print data
print '\n'.join(re.findall(r'<li>([^<>]*)</li>', data)).decode('GB2312').encode('UTF-8')    # <<<== Here!!

httpsock.close()

在输出结果时,加了 .decode('GB2312').encode('UTF-8') 来转码。。。。
上次由 yaoms 在 2008-03-14 8:00,总共编辑 5 次。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01
送出感谢: 0
接收感谢: 1 次

#6

帖子 xiechy » 2008-03-11 20:56

shell 版本

代码: 全选

#!/bin/bash

if [ "$#" -lt 1 ];then
	echo "Usage:$0 IP"
	exit;
fi

if ! echo $1|grep -x -P '((([01]?[0-9])?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}(([01]?[0-9])?[0-9]|2([0-4][0-9]|5[0-5]))' >/dev/null
then
	echo "Usage:$0 IP"
	exit;
fi

echo "  IP:$1"
echo
echo -e "ip=$1&action=2\n---"|lynx http://www.ip138.com/ips8.asp -post_data |grep -P -o '(?<=本站主数据:).*|(?<=查询结果.:).*'|cat -n

头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#7

帖子 eexpress » 2008-03-11 22:01

nnnd。 我不搞,你们就不贡献出来。
昨天,是突然觉得看ip138麻烦,而且,bash的,用w3m搞不定post。才邦蛮找这个ip库的。

下次,有好东西,早出哦。
● 鸣学
头像
sevk
帖子: 2059
注册时间: 2007-05-08 16:26
系统: arch
来自: 火星内核某分子内某原子核内
送出感谢: 20 次
接收感谢: 6 次
联系:

#8

帖子 sevk » 2008-03-11 22:12

我又学到东西了,虽然我目前还看不懂,不过应该快看懂了.....
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#9

帖子 eexpress » 2008-03-12 13:13

☎ echo -e "ip=59.41.108.142&action=2"|w3m -dump -no-cookie http://www.ip138.com/ips8.asp -post -|grep '数据:'
• 本站主数据:广东省广州市电信(越秀区)
● 鸣学
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

#10

帖子 yaoms » 2008-03-12 13:24

....我以为只有我才需要这个功能阿。。。早知道,早拿出来了。。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
millenniumdark
论坛版主
帖子: 4160
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
送出感谢: 43 次
接收感谢: 9 次
联系:

#11

帖子 millenniumdark » 2008-03-14 7:32

有用的东西。

加精。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

#12

帖子 BigSnake.NET » 2008-04-26 20:31

^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
fireshort
帖子: 161
注册时间: 2007-03-08 19:12
送出感谢: 0
接收感谢: 0
联系:

#13

帖子 fireshort » 2008-04-26 20:42

我自己当初也想办法弄了一个,放在脚本iplookup里:

代码: 全选

#!/bin/bash
curl -s -d  "ip=$1&action=2" http://www.ip138.com/ips8.asp -o /tmp/ipsearch.html
w3m -no-cookie -dump /tmp/ipsearch.html
要查的话,就在命令行里iplookup *
回复

回到 “Shell脚本”