題 通過SSH遠程備份


我有兩台電腦,我的本地和遙控器。我想通過ssh使用tar命令備份遠程服務器,但在本地計算機上保存tar文件。可能嗎?


5
2018-03-19 12:28


起源


取決於你在做什麼,你可能想要研究 rsync - Russell Uhl


答案:


以下是我所做的兩個例子:一個用於文件,一個用於MySQL。兩者都是拉動解決方案您的本地計算機登錄到遠程計算機並檢索文件。但是,本地計算機會通知遠程計算機準備存檔。

設置和背景

我使用crontab和無密碼身份驗證與ssh在遠程計算機上存檔和gzip,然後通過ssh將gzip的輸出定向到本地計算機。確保crontab和 無密碼驗證 已成立。我也有一些清理單行。

這樣做的好處是它可以最有效地使用帶寬。缺點是它的資源更加密集,儘管在現代硬件上我懷疑這很重要,除非你處理的是荒謬的大文件。

備份文件和目錄

這可能是你關心的部分。告訴ssh在gzip上執行tar和pipe 遠程機器。讓gzip將壓縮文件寫入標準輸出(c flag)並將輸出定向到你的文件 本地 機。

00 00 * * * /usr/bin/ssh login@host "sudo tar -cf - -C /path/to/directory/to/backup/ file_to_back_up | gzip -9c" > /file/on/local/machine/BackUp_$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).tar.gz

重要: file_to_back_up 是你實際備份的文件;它可以是文件或目錄。它也可以是一系列文件:file1.txt,file2.php等。

9 flag是最大gzip壓縮。

-cf - flags和parameter創建一個新的存檔並將數據吐出到標準輸出。該 -Cflag告訴tar從與當前目錄不同的目錄開始。 file_to_back_up可以是文件或目錄。這使得存檔中存在許多無關的相對路徑。如果你想備份你的主目錄中的東西,我想你可以省略 -C /path/to/directory/to/backup/ 因為ssh默認會將您登錄到您的主目錄。

date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A 會生成一個時間戳 2015-03-19-08h58m09s_Thursday

crontab列 00 00 * * * 基本上每天都是午夜。

備份MySQL數據庫

與上述類似。需要注意的是,您需要確保您的mysql訪問權限也可以無密碼;安全的方法是使用.cnf文件。如果你不使用MySQL,請跳過本節,但這個概念可以延續到其他工具。

30 0,13 * * * /usr/bin/ssh user@remote.host "mysqldump --defaults-file=.my.database.cnf -uroot databasename | gzip -9c" > /path/to/databasebackup_$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).sql.gz

.cnf文件包含登錄憑據,因此您不必通過shell傳遞它們,以便它們出現在 ps 供其他用戶查看。它應該包含:

[client] user=mysqluser password=yourpassword host=localhost

根據您的設置,您可能需要一組這些用於不同的項目/數據庫。如果不這樣做,默認使用.my.cnf。

安全:你可能想做 chmod 600 *.cnf 所以只有所有者才能讀寫這個文件。

清理

我傾向於使用自動刪除超過五天的備份 find命令,除非它們在周五落下。我星期五更長時間存檔這就是我在文件名中包含星期幾的原因。


3
2018-03-19 14:24



是的,它的作品。但是如果你在crontab中將sudo添加到遠程命令,那麼你將需要輸入密碼並且不會執行命令。如果你想使用sudo,可以使用-S選項。這將告訴sudo從stdin獲取密碼:00 00 * * * / usr / bin / ssh login @ host“echo password | sudo -S tar -cf - -C / path / to / directory / to / backup / file_to_back_up | gzip -9c“> / file / on / local / machine / BackUp _ $(date + \%Y - \%m - \%d - \%Hh \%Mm \%Ss _ \%A).tar.gz - QkiZ
如果其他人有權訪問進程列表,則安全性不高。更好的是你為輪組製作sudo無密碼。以root編輯/ etc / sudoers並取消註釋“%wheel ALL =(ALL)NOPASSWD:ALL”並保存。還要將自己添加到wheel組。對於一般任務,這種方式你只需“sudo bash”成為root而不是“su”後跟手動輸入密碼。 - Bolwerk
或者,更好的是,如果將它留出來是一種選擇,請將sudo留出。 - Bolwerk
或者添加其他用戶,僅用於進行備份。使用帶有參數的嚴格tar命令將他添加到sudoers,以便在沒有密碼的情況下使用它。 - QkiZ


是的,一些例子:

tar cvjf - * | ssh user@host "(cd /desired/path; tar xjf -)"
tar cvzf - dir/ | ssh user@host "cat > /backup/dir.tar.gz"
tar cvzf - dir/ | ssh user@host "dd of=/backup/dir.tar.gz"
ssh user@host "cat /backup/dir.tar.gz" | tar xvzf -
tar cvjf - * | ssh root@host "(cd /desired/path; tar xjf - )"

備份遠程計算機並在本地計算機上保存tar

ssh user@host "(cd /desired/path; tar cvzf - *)" > /path/to/backup.tar.gz

其他用法示例: https://blog.bravi.org/?p=259


2
2018-03-19 12:33



你有誤會的問題。您的命令備份本地計算機並在遠程提取tar但我想備份遠程計算機並在本地計算機上保存tar。 - QkiZ
請仔細閱讀問題。你的答案是 不 回答原來的問題。 - DavidPostill♦
正是在搜索“tar over ssh”時我正在尋找的東西。謝謝@floc。 - xpt