【问题标题】:python sys.stdin.read() unwanted splitpython sys.stdin.read() 不需要的拆分
【发布时间】:2015-05-21 15:45:29
【问题描述】:

我正在尝试制作一个脚本,我可以将 IP 地址通过管道传输到并让它返回 geoip 位置。当我尝试这个时,看起来它一次将每个 IP 地址拆分为 1 个字符,并且在尝试运行 iplookup() 时失败

#!/usr/bin/env python
import sys
from geoip import geolite2
def iplookup(srcip):
    for ip in srcip:
            print(ip)
            try:
                    print(geolite2.lookup(ip))
            except:
                    print("oops")
                    pass


source = sys.stdin.read()
iplookup(source)

回显数据样本(将来我想来自tail -f fast.log)命令仅提取IP地址

[root@suricata py]# echo "05/20/2015-15:57:34.607470 [**] [1:2020702:2] ET DOS Bittorrent User-Agent inbound - possible DDOS [**] [Classification: Attempted Denial of Service] [Priority: 2] {TCP} 8.8.8.8:2039 -> 1.1.1.1:80" | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' | python mygeoip.py

8
oops
.
oops
8
oops
.
oops
8
oops
.
oops
8
oops

等等……

【问题讨论】:

  • sys.stdin.read() 为您提供一个字符串,您可以逐个字符地迭代它...

标签: python linux stdin geoip


【解决方案1】:

sys.stdin.read() 给你一个字符串,如果你有逗号分隔的 IP 地址,做这样的事情

source = sys.stdin.read()
for ip in source.split(","):
    print(geolite2.lookup(ip))

【讨论】:

  • 这不能回答问题。
  • 这种方法虽然有效。令人困惑的是,python 中的字符串是一个字符列表。
  • @dobbs 一个字符序列; Python 列表是可变的,字符串不是。
【解决方案2】:

当您调用iplookup("stackoverflow.com") 时,您的python 函数将完全按照您的要求执行,即遍历输入数组的元素。您的 for 循环告诉 python 遍历列表。

python 中的字符串是一个字符列表。

所以要么不要这样做(终止循环),要么通过iplookup((source,))iplookup([source]) 调用你的函数。

【讨论】:

  • 你实际上需要在 iplookup((source)) 中的 source 后面加一个逗号。 Python 将 () 应用于单个值作为表达式的评估。要使其成为元组,请执行 iplookup((source,))
  • @Andrew - 已修复,谢谢。 [source] 强制 python 构造一个列表,而 (source) 被展平。使用(source,) 不会变平,我应该知道;我已经被那个“功能”咬住了。
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多