这是一个Scanner

Python FTP扫描器
本文介绍了一个用Python编写的FTP扫描器的设计与实现。该扫描器能够匿名登录指定的FTP服务器,并通过递归方式遍历所有目录,列出服务器上的所有文件。文章详细解释了递归遍历的逻辑和异常处理策略。

0x00:FTP扫描器

最近,老师让写一个FTP扫描器并匿名登陆。要求扫描到所有的文件。
预备知识:

ftplib的使用
python异常处理知识
字符串处理技巧(牵扯到拼接路径)
递归程序设计技巧(需要用递归来遍历所有文件)


#思路
通过思考问题,我设计的递归参数是将父目录当作参数。这个是肯定存在的。所以不需要进行异常处理

有以下几种情况:
	1、父目录为空,所以要pwd到父目录的上一级目录
	2、父目录只存在文件,不存在文件夹 这种要读取所有的文件,然后返回上一层
	3、父目录中又有文件又有文件夹:把文件夹递归遍历完成之后,输出所有的文件,然后回到上一层

所以,开始写代码:(代码还不够完善,后期再说)
#函数功能:递归遍历每一个文件

# 如果parent为空,返回上层目录
# 如果Dir列为空,输出所有的docs列,返回上层目录
# 如果Dir列不为空,递归遍历Dir列 然后输出所有的docs列,返回上层目录




import ftplib
from ftplib import *
ftp = FTP('202.204.121.124')
ftp.login()
ftp.encoding = 'utf8'

# 拿到上层目录的路径
def getPwd(parent):
    total = 0
    for i in parent:
        if i == '/':
            total += 1
    if total == 1:
        return '/'
    ls = parent[::-1]
    for index,ori in enumerate(ls):
        if ori == '/':
            real = ls[index+1:]
            real = real[::-1]
            return real

#递归遍历父目录

def digui(parent):
    ftp.cwd(parent)
    alls = ftp.nlst()
    direcs = []
    docs = []

    # 如果这个文件夹为空  则将pwd置为它的根目录

    if len(alls) == 0:
        pwd = getPwd(ftp.pwd().encode('latin1').decode())
        ftp.cwd(pwd)
        return



    # 将parent下的东西分好类,分别装到direcs和docs
    for i in alls:
        try:
            ftp.cwd(i)
        except ftplib.error_perm:
            docs.append(i)
        else:
            direcs.append(i)
            ftp.cwd(parent)  # 别忘了cwd回parent 不然就错了

    if len(direcs):
        for i in direcs:
            if ftp.pwd().encode('latin1').decode() == '/':
                digui(ftp.pwd().encode('latin1').decode() + i)
            else:
                digui(ftp.pwd().encode('latin1').decode() + '/' + i)
        for i in docs:
            if ftp.pwd().encode('latin1').decode() == '/':
                print(ftp.pwd().encode('latin1').decode() + i)
            else:
                print(ftp.pwd().encode('latin1').decode() + '/' + i)
        pwd = getPwd(ftp.pwd().encode('latin1').decode())
        ftp.cwd(pwd)

    else:
        for i in docs:
            if ftp.pwd().encode('latin1').decode() == '/':
                print(ftp.pwd().encode('latin1').decode() + i)
            else:
                print(ftp.pwd().encode('latin1').decode() + '/' + i)
        pwd = getPwd(ftp.pwd().encode('latin1').decode())
        ftp.cwd(pwd)

digui('/')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值