一、Python连接ftp,上传下载文件
通过Python进行ftp文件的上传和下载在我们的学习和工作中都是经常用到的,这里就不做过多的介绍了。直接上代码,因为思路比较简单,没有过多的弯弯绕绕。这里主要用到的库是ftplib代码的注释中有必要的说明。
#!/usr/bin/python# coding=utf-8import osfrom ftplib import FTP # 引入ftp模块class MyFtp: def __init__(self,host,username="",password="",port=21,anonymous=0): ''' :param anonymous: 默认需要用户名密码登陆 ''' self.ftp = FTP() self.ftp.connect(host,port) if anonymous==0: self.login(username,password) def login(self,username,pwd): self.ftp.set_debuglevel(2) # 打开调试级别2,显示详细信息 self.ftp.login(username,pwd) print(self.ftp.welcome) def downloadFile(self,remotepath,localpath): ''' :param remotepath: ftp中的文件路径 :param localpath: 本地保存路径 :return: ''' os.chdir(localpath) # 切换工作路径到下载目录 filename=os.path.split(remotepath)[-1]#获取文件名称 file_handle = open(filename,"wb").write # 以写模式在本地打开文件 self.ftp.retrbinary('RETR %s' % remotepath,file_handle,blocksize=1024) # 下载ftp文件 def uploadFile(self,localpath,remotepath): ''' :param localpath:本地待上传文件路径 :param remotepath: ftp上要保存的文件夹路径 :return: ''' self.ftp.cwd(remotepath) # 以读模式在本地打开文件 file_handle = open(localpath, 'rb') filename=os.path.split(localpath)[-1] # 上传文件 self.ftp.storbinary('STOR %s' %filename, file_handle, blocksize=1024) self.ftp.set_debuglevel(0) file_handle.close() def delete(self,remotepath,filename): ''' 删除ftp上指定的文件 :param remotepath: ftp上待删除文件所在文件夹 :param filename: ftp上待删除的文件名称 :return: ''' self.ftp.cwd(remotepath) # 要登录的ftp目录 files=self.ftp.nlst()#获取当前目录下的所有文件 #如果文件存在则删除 if filename in files: self.ftp.delete(filename) # 删除ftp服务器上的文件 def close(self): self.ftp.set_debuglevel(0) # 关闭调试 self.ftp.quit()if __name__ == '__main__': ftp = MyFtp('127.0.0.1','admin','123456') #上传本地clean.txt文件到ftp_user文件夹 ftp.uploadFile('../clean.txt','ftp_user') #将ftp上的clean.txt文件下载到本地 ftp.downloadFile('ftp_user/clean.txt','./') #删除ftp上/ftp_user/clean.txt文件 ftp.delete('ftp_user','clean.txt') ftp.close()
二、Python 建立ssh连接
主要功能:远程执行linux命令,从远程服务器上传/下载文件
ssh连接主要通过paramiko进行操作,这里主要是进行了简单的二次封装。
这里说明一下以下代码用到最多的方法exec_command():
它的参数是linux命令,返回值为含有三个元素的元组——标准输入,标准输出,标准错误,需要通过read()方法读取其中具体的值。通过ssh我们就能对不同的服务器进行相关的运维工作了,不可谓不方便。
# -*- encoding: utf-8 -*-""" 提供SSH相关操作"""import sysimport paramikoclass SSHClient(object): def __init__(self, host, username, password, port=22): self.client = None self.host = host self.username = username self.password = password self.port = port def exec_command(self, command, timeout=6000): return self.client.exec_command(command, timeout=timeout) def invoke_shell(self): return self.client.invoke_shell() def callback(self, current, total): print('文件大小为: {}, 已经下载了: {}'.format(total, current)) def download(self, from_path, to_path): sftp_client = paramiko.SFTPClient.from_transport(self.client.get_transport()) sftp_client.get(from_path, to_path, callback=self.callback) sftp_client.close() def upload(self, from_path, to_path): sftp_client = paramiko.SFTPClient.from_transport(self.client.get_transport()) sftp_client.put(from_path, to_path, callback=self.callback) sftp_client.close() def __enter__(self): if self.client is not None: raise RuntimeError('SSH already connected.') try: self.client = paramiko.SSHClient() self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy) self.client.connect(self.host, self.port, self.username, self.password) except Exception as e: raise RuntimeError('Connect to {} failed, {}.'.format(self.host, e.message)) return self def __exit__(self, *args): if self.client is not None: try: self.client.close() except: pass finally: if self.client is not None: self.client.close()if __name__=='__main__':#初始化参数为主机地址、用户名、密码,端口号默认为21,如果不是21另行指定即可 with SSHClient('127.0.0.1','root','123') as s : stdin, stdout, stderr = s.exec_command("cd /root && ls") print(stdin,'\n',str(stdout.read()).split('\\n'))
这里执行了一个简单的cd命令与ls命令,效果如上图。