本文和大家分享的主要是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/
有疑问加站长微信联系(非本文作者)