2012-04-26 102 views
4

我有一個使用的paramiko一個Python代碼。與SCP的paramiko,使用不同的遠程和本地目錄

#!/usr/bin/env python 

import paramiko 

username = ('user') 
password = ('1234') 
hostname = ('test-server.com') 
ports = 22 
localD = ('/var/tmp/testxxxxxxxx.tar.gz') 
remoteD = ('/var/tmp/testxxxxxxxx.tar.gz') 



paramiko.util.log_to_file('/tmp/paramiko.log') 
transport = paramiko.Transport((hostname, ports)) 
transport.connect(username = username, password = password) 
sftp = paramiko.SFTPClient.from_transport(transport) 
sftp.put(remotepath=remoteD, localpath=localD) 

sftp.close() 
transport.close() 

有了這個代碼,與本地目錄和遠程目錄應該是平等的。如果不是「找不到文件」 如何更改或使用與local-dir不同的另一個remote-dir? 例子:

localD = ('/var/tmp/testxxxxxxxx.tar.gz') 
remoteD = ('/home/user/testxxxxxxxx.tar.gz') 

謝謝

+0

更改這些變量完全像你說的應該工作。 'sftp.put()'將'localD'路徑中的本地文件複製到遠程'remoteD'文件路徑。我可能並不完全瞭解你想要什麼,你能告訴我你做了什麼,你期望什麼以及你實際得到了什麼? – KurzedMetal 2012-04-26 18:13:20

+0

我試圖使用SFTP來轉院(本地)/ var/tmp中/文件1到(遠程)/家庭/用戶/轉移/文件1 我收到此錯誤: OSERROR:[錯誤2]沒有這樣的文件或目錄: 「/var/tmp/pruebaxxxxxxxx.tar。GZ」 這個腳本只有在本地和遠程目錄都是平等的工作,像 (本地)/ var/tmp中/文件1到(遠程)/ var/tmp中/文件1 – 2012-04-26 18:15:56

+0

我知道你不必須有本地和遠程相同,只是執行:'sftp.put(remotepath ='/ usr/jgaines2/foo.bar',localpath ='/ bin/edit.cmd')'工作得很好。 – 2012-04-26 19:17:38

回答

4

由於錯誤消息說,「沒有這樣的文件或目錄」,我會首先檢查,以確保遠程系統上存在的目錄,可寫在您正在使用的憑據。 SFTPClient類具有各種可以調用的其他方法來驗證目標路徑的存在,並在目標路徑尚不存在時創建它們。

例如,呼叫統計()方法,通過在目標路徑應該給你回一個元組相同的os.stat返回。試運行此腳本(我只是設計了一個簡單的小通道檢驗程序,並把它放進你的腳本):

#!/usr/bin/env python 

import paramiko 

username = ('user') 
password = ('1234') 
hostname = ('test-server.com') 
ports = 22 
localD = ('/var/tmp/testxxxxxxxx.tar.gz') 
remoteD = ('/var/tmp/testxxxxxxxx.tar.gz') 

def check(sftp, path): 
    parts = path.split('/') 
    for n in range(2, len(parts) + 1): 
     path = '/'.join(parts[:n]) 
     print 'Path:', path, 
     sys.stdout.flush() 
     try: 
      s = sftp.stat(path) 
      print 'mode =', oct(s.st_mode) 
     except IOError as e: 
      print e 

paramiko.util.log_to_file('/tmp/paramiko.log') 
transport = paramiko.Transport((hostname, ports)) 
transport.connect(username = username, password = password) 
sftp = paramiko.SFTPClient.from_transport(transport) 
check(sftp, remoteD) 

sftp.close() 
transport.close() 

輸出應該是這樣的:

Path: /var mode = 040755 
Path: /var/tmp mode = 040700 
Path: /var/tmp/testxxxxxxxx.tar.gz [Errno 2] No such file 

模式數字很可能會有所不同,但不應該在文件名以外的路徑的任何部分出現「沒有這樣的文件」錯誤。如果你這樣做,那麼它很可能意味着你需要構建的路徑下的地步,你想放的文件中使用sftp.mkdir()

+0

此目錄存在: localD =( '/var/tmp/testxxxxxxxx.tar.gz') 遠程化=( '/home/user/testxxxxxxxx.tar.gz') sftp.put(remotepath =遠程的,局部路徑= localD) 是likeI不能改變遠程目錄目的地,如果文件存在於/ var/tmp中,在所述遠程服務器的同一目錄被複制。 也許我必須使用os.path.join(os.getcwd()什麼的,但我不沒什麼兩樣如何 – 2012-04-26 18:40:24

+0

謝謝約翰!但如果該目錄存在,爲什麼我收到一個錯誤的文件testxxxxxxxx.tar。 GZ,顯然不是在遠程服務器上,因爲是傳輸的文件。我必須首先創建??? 我只需要通過SSH發送文件。 – 2012-04-26 19:39:23

+0

是遠程機器在UNIX機器嗎?如果是這樣,ssh進入它使用在你的腳本中使用相同的userid/pw,cd到目標目錄並執行'touch foo.bar'(關鍵是foo.bar目前還不存在,這會測試你將文件寫入該目錄的能力),如果你。得到任何錯誤,回到一切無論是CD中或作爲觸摸命令的結果,你看權限問題 – 2012-04-26 19:47:13

1

這是SFTP,它不是SCP。連接到具有dropbear設備(如那些上的OpenWRT)當存在沒有SFTP子系統,所以SFTP失敗。相反,我用抽象背後的「連接」功能的tar命令(的paramiko。

我過的paramiko可惜這裏的答案,這是在谷歌搜索的頂部但是我找實際 SCP,不實際上回答這個問題。

# argh argh argh dropbear on openwrt not compiled with sftp 
# have to use some horribleness... 

tw = connect(ipaddr, "root", server_root_password, command="tar xvf -", 
      debug_level=debug_level) 

tf = StringIO() 
tar = tarfile.open(mode= "w:", fileobj = tf) 
taradd(tar, "etc/tinc/....") 
taradd(tar, ".....", ...) 
taradd(tar, "....", ...) 
taradd(tar, "etc/init.d/tinc", ...., ex=True) 
tar.close() 

tf.seek(0) 
txt = tf.read() 
tw.t.write(txt) 
tw.t.write('^D') 
tw.t.w.close() 
tw.t.w = None 
tw.close() 
1

https://github.com/jbardin/scp.py

遠遠沒有真正回答這是問的問題,上面的代碼提供了一個實際的實現SCP的是與O兼容penssh SCP協議。我個人還沒有使用dropbear進行測試,但它是代碼,它實際上回答了主題行中的問題。

SCP!= SFTP。

相關問題