2016-01-06 153 views
0

我想寫一個簡單的Python SMTP枚舉腳本,它從文本文件(文件名作爲第二個參數 - sys.argv[2]提供)讀取用戶名,並檢查它們是否對應SMTP服務器(提供的主機名或IP 。作爲第一個參數 - sys.argv[1]我發現的東西,是一種密切的,並調整了它一下,像這樣:簡單的Python SMTP枚舉腳本

#!/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的: '海峽' 對象有沒有屬性 '追加'

我在做什麼錯?我該如何解決它?也許有一種更簡單的方法來完成我想要做的事情?

回答

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] 
+0

我感謝您的幫助,但我是一個有點困惑 - 你的意思是我的替換第一行代碼如下:'open(users)as f: for line in f: username = line.replace('\ n','') s.send('VRFY'+'us ername'+'\ r \ n') print'用用戶測試:%s'%username' – Cain

+0

@Cain那也可以:) – cdonts

+0

我覺得我快到了,但並不完全。我在上面用了你的建議(最後一段代碼),但是它產生了一個錯誤**文件「./smtp-vrfy.py」,第21行,在 user = [line.strip()for line in f .readlines if line] TypeError:'builtin_function_or_method'對象不可迭代** – Cain