0

(Linux ツールの whois を使用して) whois を実行したい IP のリストがあり、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 を使用して国情報を表示したいだけです。実行すると次のエラーが表示され、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"。シェルは文字列を2つのコマンドとして解析し、「予期しないトークン|」と文句を言います。2番目のものの始めに。これは、などの手作りの文字列を使用してもエラーが発生しない理由を説明しています"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)

grepPython は文字列の処理が得意です。サブプロセスを作成して、別のサブプロセスの出力とパターン マッチする必要はありません。

于 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 に答える