一 、ftp
主要功能:上传、下载、删除ftp上的文件
这里主要用到的库是ftplib。备注详见以下代码。
#!/usr/bin/python
# coding=utf-8
import os
from 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()
二、ssh
主要功能:远程执行linux命令,从远程服务器上传/下载文件
ssh连接主要通过paramiko进行操作,这里主要是进行了简单的二次封装。
这里说明一下以下代码用到最多的方法exec_command():
它的参数是linux命令,返回值为含有三个元素的元组——标准输入,标准输出,标准错误,需要通过read()方法读取其中具体的值
# -*- encoding: utf-8 -*-
"""
提供SSH相关操作
"""
import sys
import paramiko
class 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',20443) as s :
stdin, stdout, stderr = s.exec_command("cd /root && ls")
print(stdin,'\n',str(stdout.read()).split('\\n'))
附
若对代码有疑问,可以关注以下公众号