协助编写Python脚本

协助编写Python脚本,python,Python,我已经用Python编写了一段代码,我想修改它。 我在我的组织中执行渗透测试时使用它,我希望使我的脚本更好。 脚本获取我输入的用户名,并通过端口25连接到SMTP服务器,检查用户是否存在。 以下是脚本: #!/usr/bin/python import socket import sys if len(sys.argv) != 2: print "Usage: vrfy.py <username>" sys.exit(0) # Create a Socket

我已经用Python编写了一段代码,我想修改它。 我在我的组织中执行渗透测试时使用它,我希望使我的脚本更好。 脚本获取我输入的用户名,并通过端口25连接到SMTP服务器,检查用户是否存在。 以下是脚本:

#!/usr/bin/python

import socket
import sys

if len(sys.argv) != 2:
 print "Usage: vrfy.py <username>"
        sys.exit(0)

# Create a Socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect to the Server
connect=s.connect(('192.168.0.10',25))

# Recieve the banner
banner=s.recv(1024)
print banner

# VRFY a user
s.send('VRFY ' + sys.argv[1] + '\r\n')
result=s.recv(1024)
print result

# Close the socket
s.close()
#/usr/bin/python
导入套接字
导入系统
如果len(sys.argv)!=2:
打印“用法:vrfy.py”
系统出口(0)
#创建一个套接字
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接到服务器
connect=s.connect(('192.168.0.10',25))
#接受旗帜
banner=s.recv(1024)
印刷横幅
#VRFY用户
s、 发送('VRFY'+sys.argv[1]+'\r\n')
结果=s.recv(1024)
打印结果
#合上插座
s、 关闭()
我要执行的更改如下: 我不想只输入一个用户名进行检查,而是想提到一个txt文件的位置,脚本将读取它包含的所有用户名

此外,我希望脚本中的IP地址不会硬编码,并且每次使用脚本时都需要插入它。 多谢各位


Bar Aviv使用类似以下的方法:

with open(sys.argv[1]) as f:
    for line in f:
        username = line.replace('\n', '')
        print 'Testing with user: %s' % user
对于IP地址,可以将其作为第二个参数传递--
verify.py username list file server IP address
--并引用为sys.argv[2]

您还可以执行以下操作:

try:
    userlist = sys.argv[1]
    server_address = sys.argv[2]
except IndexError:
    print 'Usage: verify.py username-list-file server-ip-address'
    sys.exit(-1)

您实际上不应该像那样直接使用低级套接字
send()
recv()
。他们不能保证发送/接收任何特定数量的数据。它可能恰好按照您希望的方式与某个特定邮件服务器进行通信,但一旦命令/响应无法与IP数据包一一对应,您就会得到奇怪的结果

如果您想要一个简单的阻塞会话流,请尝试从中获得的文件接口

您可能还应该实现更多的SMTP。。。至少说一声helo

下面的代码从标准输入中读取用户名,因此您可以通过以下方式将一个用户名文件指向它:

python vrfy.py 127.0.0.1 < usernames.txt
这就是为什么我在邮件上禁用VRFY的原因。
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() # ignore banner
fp.write('HELO test.example.com\r\n')
fp.flush()
fp.readline() # ignore response

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()