Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
探测smtp服务器的Python脚本_Python_Sockets - Fatal编程技术网

探测smtp服务器的Python脚本

探测smtp服务器的Python脚本,python,sockets,Python,Sockets,我编写此脚本是为了测试单个ip地址,以便探测smtp服务器上的特定用户名,以进行pentest测试。我现在尝试移植这个脚本来运行相同的测试,但是要移植到一个ip地址范围,而不是单个ip地址。有人能解释一下如何实现这一目标吗 #!/usr/bin/python import socket import sys users= [] for line in sys.stdin: line = line.strip() if line != '':

我编写此脚本是为了测试单个ip地址,以便探测smtp服务器上的特定用户名,以进行pentest测试。我现在尝试移植这个脚本来运行相同的测试,但是要移植到一个ip地址范围,而不是单个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()

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

如果您使用的是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

好的,下面是我为这项工作所做的。 这个解决方案一点也不优雅,但它确实起到了作用,而且,我无法花更多的时间纯粹用Python来寻找解决方案,所以在阅读了上面bmhkim的答案后,我决定(谢谢提示)编写一个bash脚本,让它在一系列ip地址上迭代,并为每个ip地址调用我的python脚本来实现它的魔力

#!/bin/bash

for ip in $(seq 1 254); do
python smtp-probe.py 192.168.1.$ip <users.txt 
done
正如我上面所说,这是一个棘手的解决办法——我知道,但我不是程序员,所以这就是我能够找到的解决办法(如果你有一种纯Python的方法,我非常希望看到它)。一旦我有更多的时间,我肯定会再次访问这个问题,我会继续学习Python,直到我把它做好


谢谢大家对我问题的支持

你的范围将如何写?我假设
sys.argv[1]
是单个IP——您是如何通过该范围的
filename.py 192.168.1.1 192.168.1.255
?我想采用的方法是将ip范围定义为脚本的参数。比如:filename.py 192.168.1.1-254192.168.1.1-192.168.2.254?这在您的符号中是如何工作的:
192.168.1-2.1-254
?讨厌!事实上,你的结构更好,更具可读性。但是我需要查看并尝试如何将范围传递到脚本中。谢谢。哇,这是一种有趣的方法,我会在某个时候进行探索,但我现在不能这样做,因为我刚刚掌握了如何在Python2.7中执行手头的任务,所以我不知道如何修改脚本的其余部分以与版本3.3兼容。无论如何谢谢你!!
#!/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()