python3+ftplib实现ftp客户端
一、程序说明
1.1 程序实现关键点
python实现ftp客户端,主要会遇到以下四个问题:
第一个问题是使用什么包实现----我们这里是使用标准库中的ftplib
第二个问题是怎么连接登录ftp服务器----如果是ssh那么直接使用connect函数就直接完成连接和登录两项工作,而ftp要先用connect连接然后再用login登录
第三个问题是怎么实现ftp操作----怎么实现ftp操作这个问题有点麻烦,我们平时使用ftp命令登录后就可以输入下图中的命令进行ftp操作,对于其中少数一些命令ftplib确实支持通过sendcmd方法将命令传过去然后服务端就执行然后返回执行结果,但对于大多数命令ftplib都是通过一个方法去实现的(比如cd命令对应cwd
()方法,mkd
ir命令对应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
()