站長如何利用七牛云備份服務器文件?
這是我們收到的第一份投稿,感謝作者對編程派的認可和信任。 本文講述的是如何通過 Python 腳本自動化備份服務器文件,對于個人站長來說非常有參考價值。本文經作者Millyn授權進行部分編輯修改。作者的郵箱是:Millyn.network###gmail.com。如果有針對本文的疑問,可以留言或郵件咨詢作者。
對于個人站長來說,最大的夢魘莫過于服務器突然崩潰導致網站數據丟失,那樣自己辛苦的心血相當于付諸東流,可能怎么也找不回來了。因此,定期對服務器數據進行備份是一個標準實踐。可是每次登陸服務器手動進行操作顯然不是一個高效的方法,我們需要的是一鍵備份。
因此,我們決定利用編程語言 Python 寫一個自動化備份服務器文件的腳本。具體來說,我們要利用 Python 自動壓縮需要備份的文件或目錄,然后上傳到云端存儲(這里我們選擇了七牛云),然后在往自己的郵箱發送備份文件的下載鏈接。
相應地,我們會用到以下模塊:
- zipfile:壓縮文件或目錄
- qiniu:上傳文件至七牛并返回下載鏈接
- smtplib:用于發送郵件
接下來,我們就一步一步來實現這些功能。
第一步:文件壓縮
ZIP壓縮應該是最簡單的步驟了,我們首先來看一段程序代碼。
import os , os.path , zipfile , time def zip_dir(dirname, zipfilename): filelist = [] if os.path.isfile(dirname): filelist.append(dirname) else: for root, dirs, files in os.walk(dirname): for name in files: filelist.append(os.path.join(root, name)) zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED) for tar in filelist: arcname = tar[len(dirname):] zf.write(tar, arcname) zf.close() if __name__ == '__main__': zip_dir(r'/home/user/httpweb',r'/home/user/web_bak' + time.strftime('%Y-%m-%d') + '.zip')
我們不表代碼究竟都是怎么寫的,每一行都是什么意思,我們只講述最終能夠做到什么。
看代碼內有一個方法 zip_dir ,這個方法需要有2個參數,分別是目標文件夾路徑及壓縮后文件存放路徑及文件名。簡單來說就是傳遞輸入和輸出目標。
那么在最下方 zip_dir(r'/home/user/httpweb',r'/home/user/web_bak' + time.strftime('%Y-%m-%d') + '.zip') ,我們傳遞了/home/user/httpweb這個目錄作為需要打包的目錄,而輸出到/home/user/這個目錄下并以 web_bak2016-04-20.zip 的文件名儲存。
這里我們可以注意到 time.strftime('%Y-%m-%d') 是取當前時間日期并格式化輸出年月日的對象。
當我們運行此Python程序后在/home/user/目錄下就可以找到對應的zip文件了。
那么第一部分打包我們已經準備好了。接下來我們準備將文件上傳至七牛云。
第二步:上傳至七牛云
首先注冊一個七牛帳號,在通過支付寶或身份證認證后應該可以獲得
- 10GB 永久免費存儲空間
- 每月 10GB 下載流量
- 每月 10萬 次PUT請求
- 每月 100萬 次GET請求
- 每月 750 小時自定義數據處理實例免費使用時間
- 每月MPS配額 20元
以上免費使用權,如果站不多肯定是夠用,備份15天的數據應該就可以,后續我會加強寫一個15天管理一次七牛儲存并刪除過期備份的Python腳本。
我們需要添加一個對象資源空間,添加時需要注意的是,訪問限制是否公開或者是私密,這里我選擇的是私密訪問。
接下來在你要運行腳本的環境里安裝qiniuSDK,在終端下輸入 pip install qiniu 來安裝qiniuSDK。
再來看一段代碼:
from qiniu import Auth import qiniu access_key = 'your_accesskey' secret_key = 'your_secretkey' q = Auth(access_key, secret_key) bucket = 'webbak' file_path = '/home/user/web_bak' + time.strftime('%Y-%m-%d') + '.zip' token = q.upload_token(bucket) ret, info = qiniu.put_file(token, 'web_' + time.strftime('%Y-%m-%d') + '.zip', file_path)
在七牛控制面板里密鑰管理界面可以查到自己的ACCESS_KEY和SECRET_KEY,或者在登入帳號后直接訪問密鑰管理。 bucket 需要設置為之前我提到創建對象資源空間的空間名。在這段代碼中,除了上傳到七牛儲存功能外是沒有其他任何功能的邏輯的,所以基本上有基礎的Pythoner都能看的懂這段代碼的意思。我就不多做解釋,關于七牛PythonSDK的文檔在這里可以查閱。
第三步:郵件發送下載鏈接
最后我們來研究一下如何發郵件告訴自己備份成功了,并在郵件內容里附上下載鏈接。(根據七牛的文檔,私密空間下載連接并不是永久的。)
我使用的是QQ的郵箱,要切記的是QQ郵箱在第三方登入時需要去申請 授權碼 ,而不是使用QQ密碼或郵箱獨立密碼來授權。
好的,我們依然是看一段代碼。
import smtplib from email.mime.text import MIMEText import time def sm(receiver, title, body): mail_host = "smtp.qq.com" # 設置服務器 mail_port = 465 # 端口 mail_user = "xx@qq.com" # 用戶名 mail_pass = "xx" # 口令 sender = 'xx@qq.com' # 發件人 msg = MIMEText(body, 'html') msg['subject'] = title msg['from'] = sender s = smtplib.SMTP_SSL(mail_host, mail_port) s.login(mail_user, mail_pass) s.sendmail(msg['from'], receiver, msg.as_string()) sm('收件郵箱','標題','內容')
我依舊是寫了個方法,該方法有3個參數。 sm('收件郵箱','標題','內容') 調用整個方法時需要傳遞的參數就是這些,文字已經很清楚了。
那么發郵件很簡單,但我們要做的是在郵件內容里面包含下載備份文件的鏈接,那么我們需要進行修改的地方肯定就是sm方法的第三個參數 內容 這個部分了。
內容參數是可以這么去寫的,例如
n = '''<h1>標題</h1> <p>aaaaaa</p> <h3>bbbbb</h3> '''
所以我們現在要獲取鏈接,就應該從上傳到七牛那個部分著手。
現在你可以創建一個新文本。把頁面拉動到上面上傳至七牛云的那一段代碼。接下來我們開始增加幾行代碼。
bucket_domain = '空間域名地址' base_url = 'http://%s/%s' % (bucket_domain, file_name) private_url = q.private_download_url(base_url, expires=3600)
結語
那怎么增加,增加到那里,并且最后怎么運用到MAIL的發送里,我相信如果能堅持讀到這里的讀者們肯定是可以做到自己修改這部分代碼來實現功能的。
我從第一段代碼到最后一段代碼都沒有把標題里所描述的功能統一實現,而是用分段解釋代碼的作用來描寫這篇文章,最終的目的也就是為了使得讀者在看的時候能夠去思考,能夠去想象自己在寫的時候應該是怎么樣的。
很久沒有寫長篇的文章了,肯定會有一些啰嗦,希望能夠幫助到大家。
來自: http://www.codingpy.com/article/how-to-backup-server-data-using-python-and-qiniu/