2009-11-01 113 views
17

我一直想編寫一個python腳本,它將按順序運行幾個rsync實例,以便將數據備份到另一臺計算機。用Python控制rsync?

目前我只有這個文本文件與我使用的命令,我剛剛複製粘貼到終端,它似乎有點傻。

我想能夠使用python爲我做這個。我非常隱約地知道如何使用subprocess.popen,但我不知道如何讓python直接與rsync交互,就像爲我輸入密碼一樣。 python能做到嗎?

喜歡的東西:

if theProccess.proccessResponse == "Password:" : 
    theProccess.respond(string) 

或者是我能做的最好的只是有它,甚至是bash腳本,只要運行序列中的rsyncs,不得不再次輸入我的密碼,一遍又一遍?

在此先感謝。

回答

6

我使用rsync備份所有客戶的網站。腳本是由cron觸發的,並且由於它們的不同需求,它爲每個客戶端使用Makefile。

而不是做一些輸入密碼的東西,使用ssh-keygen創建一個公鑰/私鑰對,並將您的公鑰放在遠程機器上。這爲您提供安全的無密碼連接。這也意味着你不必將rsync端口暴露給世界。當你在這個過去的學習曲線(並不是很陡峭)之後,ssh是絕大多數你的朋友。

+0

我絕對考慮過使用密鑰對來做這件事,但我想看看是否有可能讓另一個程序控件成爲另一個程序控件,因爲它看起來像是一種技巧,可以派上用場,適合需要互動的情況,不要輕易忽視它。但是我可能最終會做一個密鑰對...... – Cheesemold 2009-11-01 17:12:03

1

如果您需要以編程方式控制子過程,則應該使用pexpect進行調查。

+0

這將與許多人相關:「Pexpect的主要特性需要Python標準庫中的pty模塊,該模塊僅適用於Unix類系統。」# – Mawg 2016-10-20 07:26:05

21

如果您想與一般子流程進行交互,您可以使用pexpect,如其他地方所述。但是對於你的特殊情況,假設你的rsync通過ssh運行(默認),那麼你可能需要考慮在兩臺主機之間建立一個連接,這樣就不需要輸入密碼。這是一個key-based solution,並且比將密碼存儲在源代碼中更安全。

Here's a blogger誰討論你的確切問題,並決定使用無密碼的SSH。

1

我不認爲它支持rsync開箱,但paramiko可能有一些組件可以回收?

0

如果您只需輸入密碼,則可以嘗試填充RSYNC_PASSWORD環境變量或使用--password-file選項。

7

Colin Stewart寫的一個很棒的Python模塊叫做RSyncBackup,這個模塊很少有人知道,也很少有文檔記錄,但是非常有用。

默認情況下,它不包含其中包括您的rsync命令的密碼的方法,讓我修改的模塊並在此博客文章談到這一點:http://technofart.blogspot.com/2012/02/rsync-controlled-by-python.html

我修改的模塊的鏈接可在我的文章的下載部分找到。

基於密鑰的解決方案也是一個好主意。此外,許多rsync實現將查找您可以設置的RSYNC_PASSWORD環境變量。如果您的環境變量對其他用戶可見,請小心。

2

我感覺不好,爲了回答這個問題,但我覺得每個人的回答都是錯誤的。他們做了KINDA回答你的問題,但不是直接回答你的問題。

更重要的是,你已經問過如何交互地獲取密碼。要做到這一點,我會建議內置的getpass。總之,你沒有與rsync進行交互。您在執行rsync之前從用戶RIGHT獲取密碼,並將其傳遞到rsync。另一種選擇是允許用戶在把它作爲一種選擇,我的大部分命令行腳本的使用optparse

import getpass 
password = getpass.getpass('Password for %s: ' % opts.user) 
try: 
    #code that uses password 
except Exception, e: 
    # test to see if str(e) is really an invalid password error, if so tell the user and return or loop, up to you 
    # else 
    raise Exception(e) # the error that was raised in the first place 

要繼續,我偶然發現了你的問題,因爲我一直在尋找類似的東西。只是一個供參考其他任何人在那裏,我結束了引用兩個這樣的堆棧溢出鏈接: calling rsync from python subprocess.callPython Subprocess.Popen from a thread

0

我做了一個叫做paralle_rsync,做並行的rsync命令。 您可以在Fabric中使用它來同時在多個主機上執行操作。

+0

Where我們是否找到這個包?它是如何獲得許可的? – Mawg 2016-10-20 07:22:26