Python实现ftp上传,下载删除文件;Python连接ssh远程操作服务器

一 、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'))

在这里插入图片描述

若对代码有疑问,可以关注以下公众号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demonslzh6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值