sftp连接报no such file_关于Python,你不得不会的远程操作:ftp文件上传下载,ssh远程连接服务器...

本文介绍了如何使用Python的ftplib库进行FTP文件的上传和下载,以及paramiko库实现SSH连接,包括远程执行Linux命令、文件上传与下载。通过示例代码详细展示了FTP与SSH的基本操作,方便进行服务器管理。
摘要由CSDN通过智能技术生成

d38ea868ce4c7799a0773471e4685285.png

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

043322e8c81aaa2daac08f6ad49f2bc1.png

这里执行了一个简单的cd命令与ls命令,效果如上图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值