2017-01-27 46 views
0

我想從磁盤映像發送到使用paramiko遠程服務器的每個文件。Pytsk - 從磁盤映像發送文件到服務器

class Server: 
    def __init__(self): 
     self.ssh = paramiko.SSHClient() 
     self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
     self.ssh.connect('xxx', username='xxx', password='xxx') 

    def send_file(self, i_node, name): 
     sftp = self.ssh.open_sftp() 
     serverpath = '/home/paul/Testing/' 
     try: 
      sftp.chdir(serverpath) 
     except IOError: 
      sftp.mkdir(serverpath) 
      sftp.chdir(serverpath) 
     serverpath = '/home/Testing/' + name 

     sftp.putfo(fs.open_meta(inode = i_node), serverpath) 

但是,當我運行這個時,我得到一個錯誤,說「pytsk.File沒有讀取屬性」。

是否有任何其他方式發送此文件到服務器?

+0

請修改您的代碼片段以包含您的依賴關係/導入。您可能會以這種方式獲得更多幫助,因爲這依賴於大多數論壇用戶可能不熟悉的特定Python模塊。你的「fs」變量只是出現在某個地方,我們不知道你是如何初始化它以及可能在後面的文件系統。 – Hannu

+0

Paramiko部分和用於發送文件的機制可能沒有問題。這可能只是使用pytsk的一個問題,並且要了解在這種情況下知道什麼是「fs」是至關重要的。 – Hannu

回答

0

經過快速調查,我想我找到了你的問題。 Paramiko的sftp.putfo需要一個Python文件對象作爲第一個參數。 Pytsk3的文件對象是完全不同的東西。您的sftp對象試圖對此執行「讀取」,但Pytsk3文件對象沒有「讀取」方法,因此出現錯誤。

可能理論上試着擴展Pytsk3.File類並添加這個方法,但我不會屏住呼吸,它實際上工作。

我只是將文件讀取到臨時文件併發送該文件。像這樣的東西(你需要做臨時文件名的處理更聰明,然後刪除該文件,但你的想法):

serverpath = '/home/Testing/' + name 
tmp_path = "/tmp/xyzzy" 
file_obj = fs.open_meta(inode = i_node) 

# Add here tests to confirm this is actually a file, not a directory 

tha = open(tmp_path, "wb") 
tha.write(file_obj.read_random(0, file_obj.info.meta.size)) 
tha.close() 

rha = open(tmp_path, "rb") 
sftp.putfo(rha, serverpath) 
rha.close() 
# Delete temp file here 

希望這有助於。這將從fs映像讀取內存中的整個文件以寫入臨時文件,因此如果文件很大,則會導致內存不足。

要解決這個問題,你應該用適當的塊(參數是起始偏移量和讀取的數據量)以read_random循環讀取文件,允許你構建一個臨時文件塊例如幾兆字節。

這只是一個簡單的例子來說明你的問題。

Hannu

+0

我正在考慮做這樣的事情,但我正在使用該程序來執行完整的磁盤獲取,我擔心這會寫入磁盤 – Ledwith94

+0

您可以嘗試擴展Pytsk3.File並添加一個read()方法,然後使用self.read_random來讀取實際數據。它甚至可能工作,但我沒有嘗試。但是,如果您選擇臨時路徑駐留在用於啓動採集設備的本地文件系統上,我沒有看到它將寫入目標驅動器的原因。 – Hannu