0

我有一个 IP 列表,我想针对这些 IP 运行 whois(使用 linux 工具 whois),并且只看到 Country 选项。

这是我的脚本:

import os
import time

iplist = open('ips.txt').readlines()

for i in iplist:
        time.sleep(2)
        print "Country: IP {0}".format(i)
        print os.system("whois -h whois.arin.net + {0} | grep Country ".format(i))

所以我想显示正在运行的 IP,然后我只想使用 grep 查看 Country 信息。当我运行它并且 grep 没有运行时,我看到了这个错误:

sh: -c: line 1: syntax error near unexpected token `|'
sh: -c: line 1: ` | grep Country '

下面的代码有效,所以它一定是我的 for 循环的问题:

 print os.system("whois -h whois.arin.net + {0} | grep Country ".format('8.8.8.8'))

我究竟做错了什么?谢谢!!!!

4

3 回答 3

6

您不会从从文件中读取的行中删除尾随换行符。结果,您将传递给os.system"whois -h whois.arin.net + a.b.c.d\n | grep Country". shell 将字符串解析为两个命令并抱怨“意外的令牌 |” 在第二个开头。这就解释了为什么使用手工制作的字符串如"8.8.8.8".

睡眠后添加i = i.strip(),问题就会消失。

于 2012-09-12T17:31:11.880 回答
1

user4815162342 对您遇到的问题是正确的,但我可以建议您替换os.systemsubprocess.Popen? 捕获system呼叫的输出并不直观.. 如果您希望结果转到屏幕以外的任何地方,您可能会遇到问题

from subprocess import Popen, PIPE

server = 'whois.arin.net'

def find_country(ip):
    proc = Popen(['whois', '-h', server, ip], stdout = PIPE, stderr = PIPE)
    stdout, stderr = proc.communicate()

    if stderr:
        raise Exception("Error with `whois` subprocess: " + stderr)

    for line in stdout.split('\n'):
        if line.startswith('Country:'):
            return line.split(':')[1].strip() # Good place for regex


for ip in [i.strip() for i in open('ips.txt').readlines()]:
    print find_country(ip)

Python 在字符串处理方面非常出色——应该没有理由创建一个grep子进程来模式匹配单独子进程的输出。

于 2012-09-12T17:43:53.103 回答
0

试试sh

import os
import time
import re
import sh

iplist = open('ips.txt').readlines()

for i in iplist:
    time.sleep(2)
    print "Country: IP {0}".format(i)
    print sh.grep(sh.whois(i, h="whois.arin.net"), "Country")
于 2012-09-14T21:11:37.050 回答