简单的Python SMTP枚举脚本

时间:2016-01-06 02:14:10

标签: python smtp-auth

我正在尝试编写一个简单的Python SMTP枚举脚本,该脚本从文本文件中读取用户名(作为第二个参数提供的文件名 - sys.argv[2]),并针对SMTP服务器(主机名或提供的IP)进行检查第一个参数 - sys.argv[1]。我找到了一些接近的东西,并稍微调整了一下,如下:

#!/usr/bin/python

import socket
import sys

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

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

fn.readline()                
fn.write('HELO testing.com \r\n')
fn.flush()
fn.readline()

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

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

但是,当我运行脚本时(例如):

./smtp-vrfy.py 192.168.1.9 users.txt 

导致错误:

文件" ./ smtp-vrfy.py",第10行,在     users.append(线) AttributeError:' str'对象没有属性'追加'

我做错了什么?我该如何解决?也许有一种更简单的方法来完成我想要做的事情?

1 个答案:

答案 0 :(得分:3)

users是一个文件名,但您没有阅读它。相反,看看会发生什么:

>>> users = "users.txt"
>>> for line in users:
...     print(line)
...
u
s
e
r
s
.
t
x
t

你可能想要:

with open(users) as f:
    for line in f:
        # ...

更好:

filename = sys.argv[2]
with open(filename) as f:
    users = [line.strip() for line in f.readlines() if line]