我有一个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'))
我做错了什么?谢谢!!!!
答案 0 :(得分:6)
您不会从您从文件中读取的行中删除尾随换行符。因此,您将向os.system
传递"whois -h whois.arin.net + a.b.c.d\n | grep Country"
之类的字符串。 shell将字符串解析为两个命令并抱怨“意外令牌”在第二个开头。这解释了当您使用"8.8.8.8"
等手工制作的字符串时没有错误的原因。
睡眠后添加i = i.strip()
,问题就会消失。
答案 1 :(得分:1)
user4815162342关于您遇到的问题是否正确,但我建议您将os.system
替换为subprocess.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
子进程来模式匹配单独子进程的输出。