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