2012-10-11 18 views
1

我正在server 1上工作。我需要編寫一個Python腳本,我需要連接到一個server 2,並從某個目錄中獲得某些文件(名稱以字母'HM'開頭的文件),並將它們放入另一個目錄中,該目錄需要在運行時創建(因爲對於程序的每次運行,都必須創建一個新目錄並且必須將文件轉儲到那裏),在server 1上。我需要在Python中做到這一點,我對這種語言比較陌生。我不知道從哪裏開始的代碼。有沒有解決方案不涉及'tarring'文件?我通過paramiko瀏覽過,但是一次只傳輸一個文件給我所知。我甚至看過glob,但我無法弄清楚如何使用它。有人可以幫我拿出代碼嗎?Python腳本從一臺服務器獲取文件到另一臺服務器並將它們存儲在單獨的目錄中?

+1

在將文件移動之前是否有任何問題? – avasal

+0

這不是直接的答案,但它聽起來像[織物](http://docs.fabfile。 org/en/1.4.3/index.html) – kojiro

+0

@avasal我只是不想打他們,因爲我認爲這會花費很多時間。 – user1452759

回答

1

傳輸的文件,你可能想看看的paramiko

import os 
import paramiko 

localpath = '~/pathNameForToday/' 
os.system('mkdir ' + localpath) 
ssh = paramiko.SSHClient() 
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts"))) 
ssh.connect(server, username=username, password=password) 
sftp = ssh.open_sftp() 
sftp.get(remotepath, localpath) 
sftp.close() 
ssh.close() 

我你想使用水珠你可以這樣做:

import os 
import re 
import glob 

filesiwant = re.compile('^HM.+') #if your files follow a more specific pattern and you don't know regular expressions you can give me a sample name and i'll give you the regex4it 
path = '/server2/filedir/' 
for infile in glob.glob(os.path.join(path, '*')): 
    if filesiwant.match(infile): 
     print "current file is: " + infile 

否則一個更容易的選擇是使用os.listdi r()

import os 
for infile in os.listdir('/server2/filedir/'): 
    ...` 

是否回答你的問題?如果沒有留下評論

+0

我需要在運行時指定「服務器2」(我將每次執行程序時)的目錄。據我所知paramiko不允許基於目錄的傳輸。那裏必須是一個文件名。但我偶爾不會知道所有以'HM' – user1452759

+0

開頭的文件的名字,爲了得到遠程目錄中的文件列表,你可以在我的第一塊代碼中使用名爲'sftp'的變量,如下所示: 'listOfFiles = sftp.listdir(remotedirectory)',那麼你就可以遍歷這些並將名稱和模式匹配起來,就像我在第二塊代碼中所顯示的那樣。那對你有用嗎? – pythonian29033

+0

我實際上使用了這段代碼的一個變體,並得到了我想要的。我沒有使用sftp.listdir(remotedirectory)。我使用exec_command來獲取文件列表,將它們存儲在varibale中,然後相應地從遠程服務器獲取它們,但我一定會查看sftp.listdir。謝謝你的幫助!非常感激! – user1452759

1

Python不會是我的第一選擇,但您可以使用對系統的調用並運行mkdir和rsync。特別是你可以做

import os 
os.system("mkdir DIRECTORY") 
os.system("rsync -cav [email protected]:/path/to/files/HM* DIRECTORY/") 
+0

不清楚爲什麼這是downvoted,它與面料相同的事情,我只是沒有直接寫Python代碼。 – Joe

+1

也許是因爲OP特意要求提供Python解決方案。 –

+0

os.system() – Joe

0

你可以使用fabric。在Server1上創建fabfile.py

import os 
from fabric.api import get, hosts 

@hosts('server2') 
def download(localdir): 
    os.makedirs(localdir) # create dir or raise an error if it already exists 
    return get('/remote/dir/HM*', localdir) # download HM files to localdir 

並運行:fab download:/to/dir從同一目錄在shell(fabfile.pyfabMakefilemake)。

+0

我收到以下錯誤: 致命錯誤:找不到任何fabfiles! – user1452759

+0

執行'fabfile.py'時我犯了一個錯誤嗎? – user1452759

+0

@ user1452759:使用'fabfile.py'從目錄運行'fab'。 – jfs

0

只需使用ssh和tar。沒有必要讓Python的參與

$ ssh server2 tar cf - HM* | tar xf - 

遠程焦油可以通過管道直接進入當地的焦油

+0

我需要編寫一個腳本來執行此操作。我選擇了Python。 – user1452759

+0

如果我們將這作爲python腳本的一部分來完成,那麼在python中做其他事情時,最好使用python函數。 –

+0

@EL_DON,對我來說,這取決於情況。有時候最好將子進程內置到爲簡單腳本添加更多依賴的工具中。 –

相關問題