2013-01-16 65 views
2

我試圖通過libssh2的no-ack的python byndings將一組文件發送到遠程服務器,但由於缺少文檔,我完全失去了對庫的使用。如何使用python 3.2使用scp發送文件?

我已經嘗試過使用C語言的libssh2文檔不成功。

由於我使用python 3.2,paramiko和pexpect是不可能的。 任何人都可以提供幫助嗎?

編輯:我剛剛在他的帖子中發現了一些代碼在no-Ack的博客評論。

import libssh2, socket, os 

SERVER = 'someserver' 
username = 'someuser' 
password = 'secret!' 

sourceFilePath = 'source/file/path' 
destinationFilePath = 'dest/file/path' 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((SERVER, 22)) 

session = libssh2.Session() 
session.startup(sock) 

session.userauth_password(username, password) 

sourceFile = open(sourceFilePath, 'rb') 

channel = session.scp_send(destinationFilePath, 0o644, os.stat(sourceFilePath).st_size) 

while True: 
    data = sourceFile.read(4096) 
    if not data: 
     break 
    channel.write(data) 

exitStatus = channel.exit_status() 
channel.close() 

似乎工作正常。

+0

你可以分享你已經嘗試什麼代碼的例子嗎? – Brandon

+0

我剛剛在@ no-ack的頁面中找到了一些示例代碼。 似乎工作正常。 – Limozilla

+1

請包括代碼作爲您的問題的答案並將其標記爲正確。否則很多人會閱讀這個想要幫助的問題,你只會浪費他們的時間。 – Sheena

回答

4

下面是如何在Python 3.2中使用libssh2獲得文件。爲了向我展示這一點,我非常讚賞no-Ack。你需要的Python3綁定libssh2 https://github.com/wallunit/ssh4py

import libssh2, socket, os 

SERVER = 'someserver' 
username = 'someuser' 
password = 'secret!' 

sourceFilePath = 'source/file/path' 
destinationFilePath = 'dest/file/path' 


sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((SERVER, 22)) 

session = libssh2.Session() 
session.startup(sock) 

session.userauth_password(username, password) 
(channel, (st_size, _, _, _)) = session.scp_recv(sourceFilePath, True) 

destination = open(destinationFilePath, 'wb') 

got = 0 
while got < st_size: 
    data = channel.read(min(st_size - got, 1024)) 
    got += len(data) 
    destination.write(data) 

exitStatus = channel.get_exit_status() 
channel.close()