2011-08-21 88 views
2

如何使用子進程和ssh從大遠程文件讀取數據?使用python子進程和ssh讀取遠程文件?

+0

你要運行用SSH遠程服務器上的程序,需要訪問文件?你想用SCP將文件複製到你的電腦嗎?你希望Python能夠直接讀取或寫入文件嗎?您需要提供更多關於您爲了回答這個問題而想要做什麼的細節。 – agf

+0

在我的程序中,我想列出遠程服務器上特定目錄下的文件。用戶然後選擇對這些文件中的一個進行操作。這些文件相當大,所以我希望能夠逐行閱讀(以避免內存問題)。如果線路符合條件;對該行進行一些操作,直到達到文件結尾。 – sdfasdfasdf

回答

6
import subprocess 
ssh = subprocess.Popen(['ssh', '[email protected]', 'cat', 'path/to/file'], 
         stdout=subprocess.PIPE) 
for line in ssh.stdout: 
    line # do stuff 
+0

羅斯,我有完全相同的命令,你建議,但只讀第一行,不讀其他行。如何讓它讀取文件中的所有行? – user2921139

+0

我應該說,通過使用上面的你,文件內容是逐字符讀取的。我怎樣才能完整地讀取整行? 「split('\ n')」似乎不起作用。 – user2921139

+1

在'ssh.stdout'後面刪除'.readline()',你想循環輸出而不是第一行。 –

1

答案上面會工作,但你必須設置你的ssh登錄your boxes之間不使用密碼。還有其他一些使用Python在計算機之間傳輸文件的方法。一個簡單的方法,沒有身份驗證是設置一個Apache服務器,並使用http request

0

使用iterreadline讀取每個全線:

for i in iter(f.stdout.readline,"") 
1

對於性能的提高,這是非常重要的文件的時候就大了,有rsync的。有關詳細的改進更多信息,請參見下面的帖子,並從拉法答案: How does `scp` differ from `rsync`?

算法然後將下面使用rsync

import subprocess 

subprocess.Popen(["rsync", host-ip+'/path/to/file'],stdout=subprocess.PIPE) 
for line in ssh.stdout: 
    line # do stuff 
+0

這不起作用。 – Sarien