python3+ftplib实现ftp客户端

一、程序说明

1.1 程序实现关键点

python实现ftp客户端,主要会遇到以下四个问题:

第一个问题是使用什么包实现----我们这里是使用标准库中的ftplib

第二个问题是怎么连接登录ftp服务器----如果是ssh那么直接使用connect函数就直接完成连接和登录两项工作,而ftp要先用connect连接然后再用login登录

第三个问题是怎么实现ftp操作----怎么实现ftp操作这个问题有点麻烦,我们平时使用ftp命令登录后就可以输入下图中的命令进行ftp操作,对于其中少数一些命令ftplib确实支持通过sendcmd方法将命令传过去然后服务端就执行然后返回执行结果,但对于大多数命令ftplib都是通过一个方法去实现的(比如cd命令对应cwd()方法,mkdir命令对应mkd()方法等,参见1.2

第四个问题是怎么实现文件的上传下载----文件上传下载其实也是ftp操作的一部份,如上面所说ftplib基本是每个命令都使用一个方法去实现,而对于上传的put命令对应的就是storbinary方法,对于下载的get命令对应的就是retrbinary方法。具体参数和用法可参看下边程序源代码

 

1.2 常用ftp命令与函数对应关系

全部方法及方法参数解析可参看官方文档

ftp命令 对应的FTP对象方法 备注
ls nlst([pathname]) Return a list of file names as returned by the NLST command.
dir dir([pathname])  Produce a directory listing as returned by the LIST command, printing it to standard output.
rename rename(fromname, toname) Rename file fromname on the server to toname.
delete delete(filename) Remove the file named filename from the server.
cd cwd(pathname) Set the current directory on the server.
mkdir mkd(pathname) Create a new directory on the server.
pwd pwd() Return the pathname of the current directory on the server.
rmdir rmd(dirname) Remove the directory named dirname on the server.
  size(filename) Request the size of the file named filename on the server.
quit quit() Send a QUIT command to the server and close the connection.
close close() Close the connection unilaterally.
put storbinary(cmd, fp, blocksize=8192, callback=None, rest=None) Store a file in binary transfer mode.
get retrbinary(cmd, callback, blocksize=8192, rest=None) Retrieve a file in binary transfer mode.

 

 

 

 

 

 

 

 

 

 

 

 

1.3 程序截图

程序执行结果截图:

 

二、程序源代码

import logging
from ftplib import FTP

class MyFtp():
    def __init__(self):
        self.ftp_client = FTP()

    # 些函数实现ftp登录
    def ftp_login(self,host_ip,username,password):
        try:
            self.ftp_client.connect(host_ip,port=21,timeout=10)
        except :
            logging.warning('network connect time out')
            return 1001
        try:
            self.ftp_client.login(user=username, passwd=password)
        except:
            logging.warning('username or password error')
            return 1002
        return 1000

    # 此函数执行ftp命令,并打印命令执行结果
    def execute_some_command(self):
        # 通运sendcmd方法形式执行pwd命令,为使用形式统一起见不推荐使用此种形式,而且其实大多数命令都是支持这种形式的
        command_result = self.ftp_client.sendcmd('pwd')
        logging.warning('command_result:%s'% command_result)
        # 通过直接使用pwd方法执行pwd命令,推荐统一使用此种形式
        command_result = self.ftp_client.pwd()
        logging.warning('command_result:%s' % command_result)
        # 上传文件;'stor ftp_client.py'告诉服务端将上传的文件保存为ftp_client.py,open()是以二进制读方式打开本地要上传的文件
        command_result = self.ftp_client.storbinary('stor ftp_client.py',open("ftp_client.py",'rb'))
        logging.warning('command_result:%s' % command_result)
        # 下载文件;'retr .bash_profile'告诉服务端要下载服务端当前目录下的.bash_profile文件,open()是以二进制写方式打开本地要存成的文件
        command_result = self.ftp_client.retrbinary('retr .bash_profile', open('local_bash_profile', 'wb').write)
        logging.warning('command_result:%s' % command_result)

    # 此函数实现退出ftp会话
    def ftp_logout(self):
        logging.warning('now will disconnect with server')
        self.ftp_client.close()

if __name__ == '__main__':
    # 要连接的主机ip
    host_ip = '192.68.220.128'
    # 用户名
    username = 'ls'
    # 密码
    password = 'abcd1234'
    # 实例化
    my_ftp = MyFtp()
    # 如果登录成功则执行命令,然后退出
    if my_ftp.ftp_login(host_ip,username,password) == 1000:
        logging.warning('login success , now will execute some command')
        my_ftp.execute_some_command()
        my_ftp.ftp_logout()

 

参考:

https://docs.python.org/3/library/ftplib.html

 

pwd()

posted on 2018-07-11 15:39  诸子流  阅读(13201)  评论(1编辑  收藏  举报