Paramiko中上传远程文件方法步骤详解

maiziedu · · 4624 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

  本文和大家分享的主要是paramiko中上传文件的方法及步骤,希望通过本文的分享,对大家学习和使用paramiko有所帮助。   机器件文件传输   一般选择SCP或者SFTP   SCP   SCP全写是:Secure Copy,是基于SSH协议的文件拷贝方法,可以在本机与远程主机或两个远程主机之间进行文件拷贝。SCP的实现需要通过SCP协议以及SCP程序。   使用:scp localfile usr@host:dir   SFTP   在计算机领域,SSH文件传输协议 (英语:SSH File Transfer Protocol,也称 Secret File Transfer Protocol,Secure FTP或SFTP) 是一数据流连线,提供档案存取、传输和管理功能的网络传输协定。由互联网工程任务组 (IETF) 设计,透过SSH 2.0 的扩充提供安全档案传输能力,但也能够被其它协定使用。   SFTP != FTP   paramiko如何处理   以SFTP为实现   API:paramiko.SFTPClient   Paramiko它是选择SFTP的然后它提供给我们的api的一个类呢它就是paramiko.SFTPClient这个类,然后这个类呢它提供了很多的这个函数来供我们来调用来处理SFTP它的各种各样的运用,然后我们来,看一下这个编码的实现。   其实我们现在就可以在这个ParamikoClient的这个里面,来进行进一步的操作首先在初始化函数里面sftp_client为none。   self.sftp_client = None   然后这个定义一个函数直接让外部获取。   def get_sftp_client(self):   if not self.sftp_client:   self.sftp_client = paramiko.SFTPClient.from_transport(self.client.get_transport())   return self.sftp_client   现在就来看一下   sftp_client = client.get_sftp_client()   取出来,然后调用它的put,put就是向远程机器来传送文件   sftp_client.put('/Users/allen/code/paramiko_study/res.txt', '/home/allen/config.ini)   运行   ![11.png](http://studygolang.qiniudn.com/161214/59e67d4560bd8ca5a39ee78f85e86d44.png)   这个时候如何来验证   验证的时候最简单的办法,就是在看在你的远程机器上已经有了这个新文件而且可以比较它的MD5看两者是不是一致的,MD5就是验证文件的一种方法。我们可以看一下它的callback,它这个callback是返回我们可以看一下   def get_callback(size1, size2):   print size1, size2   sftp_client.put('/Users/allen/code/paramiko_study/res.txt', '/home/allen/res.txt', get_callback)   ![22.png](http://studygolang.qiniudn.com/161214/8e7c4a08640d45c17e62608c73c2a966.png)   看它其实是就是传输的数据的大小,它被调用连词。这个回调函数就是说这个paramiko它内部当这个传输开始跟结束的时候它提供了,给我们一种处理自己逻辑的一种途径,比如说我们在开始或者是结束的一些特别的操作,我们就可以,来使用这个回调函数。设计一个api的时候你应该考虑这个用户,它的一个灵活处理,如果没有这个callback的话,使用者来调用的时候,这个put这个函数就完全对外是一个是一个黑盒,然后它就没办法做一些,个性化的处理所以说现在的话我们就非常方便。这里面就观察它的状态。然后就看到了传输的一个问价的一个大小。其实就是说这个指令它本身是非常简单的,但是我们需要关注的是我们在这   from paramiko_client import ParamikoClient   client = ParamikoClient('config.ini')   client.connect()   sftp_client = client.get_sftp_client()   def get_callback(size1, size2):   print size1, size2   sftp_client.put('/Users/allen/code/paramiko_study/res.txt', '/home/allen/res.txt', get_callback)   取出这个get_sftp_client()这个函数它是有问题的,比如我们不调用它的这个函数,比调用它这个client.connect()函数,我们直接去运行它,它会有什么问题。   ![33.png](http://studygolang.qiniudn.com/161214/c6d26dce741419475ba2d733166d5bc8.png)   它就抛出了异常就是说这个sectons还没有打开,然后我们就去获取它的sftp这个transport就是说这个有一个风险,就是说前面的这个函数可能没有电用然后,它就或去这个sftp_client这个是有问题的,就是说我们这应该加一个判断,是什么。   def get_sftp_client(self):   if self.client_state == 0:   self.connect()   if not self.sftp_client:   self.sftp_client = paramiko.SFTPClient.from_transport(self.client.get_transport())   return self.sftp_client   其实我们这可以加一个很简单的一个   class ParamikoClient:   def __init__(self, config_str):   self.config = ConfigParser.ConfigParser()   self.config.read('config.ini')   self.client = paramiko.SSHClient()   self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())   self.sftp_client = None   self.client_state = 0   等于0表示未连接,我们这个连接接一旦成功我们就把它   self.client.connect(hostname=self.config.get('ssh', 'host'), port=self.config.getint('ssh', 'port')   , username=self.config.get('ssh', 'username'), password=self.config.get('ssh', 'password')   , timeout=self.config.getfloat('ssh', 'timeout'))   self.client_state = 1   ![44.png](http://studygolang.qiniudn.com/161214/5414cfb4a006422e96da2e1fd5f55793.png)   现在即便是外部它没有调用这个connect,然后我们在获取这个get_sftp_client()主动帮它检测到异常主动的connect函数把这个基础的sftp_client给建立起来。连接给建立起来这个时候,这个函数它就是实用性是比较高得。 原文链接:http://www.maiziedu.com/wiki/frame/upload/

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4624 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传