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

来源:互联网 发布:蘑菇街质量比淘宝好吗 编辑:程序博客网 时间:2024/05/20 01:10

本文和大家分享的主要是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 ProtocolSecure FTPSFTP)是一数据流连线,提供档案存取、传输和管理功能的网络传输协定。由互联网工程任务组 (IETF) 设计,透过SSH 2.0的扩充提供安全档案传输能力,但也能够被其它协定使用。

SFTP != FTP

paramiko如何处理

SFTP为实现

APIparamiko.SFTPClient

Paramiko它是选择SFTP的然后它提供给我们的api的一个类呢它就是paramiko.SFTPClient这个类,然后这个类呢它提供了很多的这个函数来供我们来调用来处理SFTP它的各种各样的运用,然后我们来,看一下这个编码的实现。

  其实我们现在就可以在这个ParamikoClient的这个里面,来进行进一步的操作首先在初始化函数里面sftp_clientnone

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()

  取出来,然后调用它的putput就是向远程机器来传送文件

sftp_client.put('/Users/allen/code/paramiko_study/res.txt', '/home/allen/config.ini)

运行

这个时候如何来验证

  验证的时候最简单的办法,就是在看在你的远程机器上已经有了这个新文件而且可以比较它的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)

  看它其实是就是传输的数据的大小,它被调用连词。这个回调函数就是说这个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()函数,我们直接去运行它,它会有什么问题。

  它就抛出了异常就是说这个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

  现在即便是外部它没有调用这个connect,然后我们在获取这个get_sftp_client()主动帮它检测到异常主动的connect函数把这个基础的sftp_client给建立起来。连接给建立起来这个时候,这个函数它就是实用性是比较高得。

 

原文链接:http://www.maiziedu.com/wiki/frame/upload/

0 0
原创粉丝点击