用于探测smtp服务器的Python脚本

时间:2015-02-06 17:37:37

标签: python sockets

我编写了这个脚本来测试一个ip地址,用于探测smtp服务器上的特定用户名。我现在正在尝试移植此脚本以运行相同的测试,但是对于一系列IP地址而不是单个地址。任何人都可以了解如何实现这一目标吗?

#!/usr/bin/python

import socket
import sys


users= []
for line in sys.stdin:
        line = line.strip()
        if line != '':
                users.append(line)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((sys.argv[1], 25))
fp = s.makefile('rwb')

fp.readline()
fp.write('HELO test.example.com\r\n')
fp.flush()
fp.readline

for user in users:
        fp.write('VRFY %s\r\n\ ' % user)
        fp.flush()
        print '%s: %s' % (user, fp.readline().strip())

fp.write('QUIT\r\n')
fp.flush()
s.close()

3 个答案:

答案 0 :(得分:1)

如果你正在使用Python3.3 +,这很简单

import ipaddress # new in Python3.3

start_ip, end_ip = however_you_get_these_as_strings()

ip_networks = ipaddress.summarize_address_range(
                 ipaddress.IPv4Address(start_ip),
                 ipaddress.IPv4Address(end_ip))
# list of networks between those two IPs

for network in ip_networks:
    for ip in network:
        # ip is an ipaddress.IPv4Address object
        probe(str(ip))
        # which converts nicely to str

答案 1 :(得分:0)

我会通过将代码转换为探测单个主机的函数来实现这一点,并将主机名/ ip作为参数。然后,遍历您的主机列表(从命令行,文件,用户的交互式查询或任何地方),并为循环中的每个主机调用单个主机探测。

答案 2 :(得分:0)

好的,所以这就是我为实现这一目标所做的工作。 解决方案根本不是优雅的,但是它可以解决问题,而且,我不能花更多的时间在Python上找到解决方案,所以我已经决定,在阅读了bmhkim上面的答案后(感谢提示) )编写一个bash脚本让它迭代一系列的ip地址,并为每个人调用我的python脚本来实现它的魔力。

#!/bin/bash

for ip in $(seq 1 254); do
python smtp-probe.py 192.168.1.$ip <users.txt 
done

我在输出方面遇到了一些问题,因为这给了我服务器对我的探测尝试的响应,但没有发送这些响应的实际IP地址,所以我已经修改了原始脚本:

#!/usr/bin/python

import socket
import sys


users= []
for line in sys.stdin:
        line = line.strip()
        if line != '':
                users.append(line)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((sys.argv[1], 25))
print sys.argv[1] #Notice the printing of the script arguments/ip addresses for my output

fp = s.makefile('rwb')
fp.readline()
fp.write('HELO test.example.com\r\n')
fp.flush()
fp.readline
for user in users:
        fp.write('VRFY %s\r\n\ ' % user)
        fp.flush()
        print '%s: %s' % (user, fp.readline().strip())


fp.write('QUIT\r\n')
fp.flush()
s.close()

就像我上面所说的那样,这是一个棘手的方法 - 我知道,但我不是程序员,所以这就是我能找到的出路(如果你纯粹用Python做的话我非常希望看到它)。一旦我有更多的时间,我肯定会重新访问这个问题,我将继续学习Python,直到我做对了。

感谢所有人对我的问题的支持!!