python脚本访问ftp服务器

昨天要访问一台别人家的ftp服务器并下载内容,要求用python代码来实现。

网上搜了搜,有很多可用的python代码,感觉很简单。

def ftpconnect(ftp_info):
    try:
        ftp = ftplib.FTP()
        ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
        ftp.connect(ftp_info[0], 21) # 第三个参数是等待时间
    except (socket.error, socket.gaierror):
        print "ERROR: cannot reach %s" % ftp_info[0]
        return None

    username = ftp_info[2]
    passwd = ftp_info[3]
    try:
        ftp.login(username, passwd)
    except ftplib.error_perm:
        print "ERROR: cannot login anonymously"
        ftp.quit()
        return None
    return ftp

if __name__ == '__main__':
    info_list = ['*****', ****, '*****', '******']
    ftp = ftpconnect(info_list)

可以很快的链接上,但是使用dir等访问数据的命令就会超时。

浏览器可以正常访问,cmd会报错, 服务器上也会报错,生气。

了解了 ftp的访问原理:

分为主动模式被动模式
主动模式:客户端用一个大于1024的端口去访问服务器的21端口,建立连接,建立“命令连接通道”,如果要发送资料,21端口告诉客户端的数据连接通道端口(也是一个>1024的端口例如1333),并监听,服务器利用20端口向客户端的1333端口发起连接,并建立“资料连接通道”。“资料联系通道”是由服务器主动建立的,所以叫做“祖东模式”。

局限性:客户端在防火墙或IP分享服务器后面,其“命令联系通道”可以顺利建立,但“资料联系通道”无法顺利建立。

被动模式:建立“命令联系通道”的方式和主动模式基本一样,也是连接服务器的21端口。但是如果需要传输资料,客户端会送出PASV指令,告诉服务器要利用被动模式建立“资料联系通道”,然后服务器会打开一个>1024端口,并开始listen,并把这个端口好通过“命令联系通道”告知客户端,客户端再打开一个>1024的端口,与服务器建立“资料连接通道”。
“资料连接通道”是由服务器被动建立的,所以称作“被动模式”。

连接的服务器是被动模式,切换成被动模式还是timeout。

python脚本访问ftp服务器_第1张图片
passive.png

被动模式测试时,服务器端返回的(10,37,17,32,59,125)
分别代表的是:
host:10.37.17.32
port:59*256+125=14461
ping了10.37.17.32 ping不通。

    UNROUTABLE_IPS = ('192.168', '10.', '172.')
    def makepasv(self):
        host, port = super(FtpClient, self).makepasv()
        if any(host.startswith(s) for s in self.UNROUTABLE_IPS):
            host = self.host
        return host, port

最后将大神说是因为 服务器返回的ip是内网ip,转化为访问之前开放的域名服务器,可能会nginx到对应的数据服务器。

对于内网IP的解释:
1、私有网段地址,10/8,172.16/12,192.168/16这几个网段的地址。这些地址所在的主机,不能用这些地址面相internet,必须被一个网关隔离在私有域内。在私有域内,地址可以随意分配,不会影响internet网络的运作。所有使用这些地址的终端,要想和网关外的主机通信,必须用NAT,PROXY或者隧道技术进行地址转换,以使得对方回复过来的数据包可以在internet上转发。
2、终端所在网络,在网关管辖范围下的某个主机地址。比如一个企业申请了一个公有地址网段200.100.50.00/24,那么被分配这个网段内地址的任何一个主机,都可以用自己分配的地址和互联网通信而无需NAT或PROXY。

你可能感兴趣的:(python脚本访问ftp服务器)