keychain shell 腳本太長(zhǎng)以致于無(wú)法在本文中列出,因?yàn)榫木帉懙哪_本中包括了很多錯(cuò)誤檢測(cè)、豐富的文檔以及非常多的跨平臺(tái)代碼。不過(guò),keychain 可以自項(xiàng)目的 Web 站點(diǎn)上方便地下載得到(參閱 參考資料 以獲得鏈接)。
下載并安裝了 keychain 后,使用它就很簡(jiǎn)單了。只需要登錄到每臺(tái)機(jī)器并將下面兩行添加到每個(gè) .bash_profile 文件:
keychain id_dsa . ~/.keychain/$HOSTNAME-sh
在您第一次重新登錄到每臺(tái)機(jī)器時(shí),keychain 將向您詢問(wèn)口令。不過(guò),除非機(jī)器被重新啟動(dòng),否則,以后再登錄時(shí),keychain 將不會(huì)再要求您重新輸入口令。最好的是,cron 任務(wù)現(xiàn)在可以使用 OpenSSH 命令來(lái)安全地訪問(wèn)遠(yuǎn)程的機(jī)器,而不需要交互地使用口令。更好的安全和更容易的使用,現(xiàn)在我們已經(jīng)兼得。
KeyChain 2.3.2; http://www.gentoo.org/projects/keychain Copyright 2002-2004 Gentoo Technologies, Inc.; Distributed under the GPL * Initializing /home/accountname/.keychain/localhost.localdomain-sh file... * Initializing /home/accountname/.keychain/localhost.localdomain-csh file... * Starting ssh-agent * Adding 1 key(s)... Enter passphrase for /home/accountname/.ssh/id_dsa: (enter passphrase)
清單 9. 在每臺(tái)機(jī)器上初始化腳本化備份過(guò)程
我們的下一個(gè)任務(wù)是創(chuàng)建執(zhí)行必要的備份過(guò)程的 shell 腳本。目標(biāo)是執(zhí)行服務(wù)器 1 和 2 的完全數(shù)據(jù)庫(kù)備份。在我們的例子中,每個(gè)服務(wù)器都運(yùn)行著 MySQL 數(shù)據(jù)庫(kù)服務(wù)器,我們使用 mysqldump 命令行工具來(lái)將一些數(shù)據(jù)庫(kù)表導(dǎo)出到一個(gè) SQL 輸入文件中。
#!/bin/sh # change into the backup_agent directory where data files are stored. cd /home/backup_agent # use mysqldump utility to export the sites database tables mysqldump -u sitedb -pG0oDP@sswrd --add-drop-table sitedb --tables tbl_ccode tbl_machine tbl_session tbl_stats > userdb.sql # compress and archive tar czf userdb.tgz userdb.sql
清單 10. 服務(wù)器 1 的 dbbackup.sh shell 腳本在服務(wù)器 2 上,我們將設(shè)置一個(gè)類似的腳本來(lái)備份站點(diǎn)數(shù)據(jù)庫(kù)中給出的獨(dú)有表單。每個(gè)腳本都通過(guò)下面的步驟標(biāo)記為可執(zhí)行的:
[server1]:$ chmod +x dbbackup.sh
在服務(wù)器 1 和 2 上設(shè)置了 dbbackup.sh 后,我們返回到離線的數(shù)據(jù)服務(wù)器,在那里我們將創(chuàng)建一個(gè) shell 腳本來(lái)調(diào)用各個(gè)遠(yuǎn)程 dbbackup.sh 腳本并隨后傳輸壓縮的(.tgz)數(shù)據(jù)文件。
#!/bin/sh # use ssh to remotely execute the dbbackup.sh script on server 1 /usr/bin/ssh backup_agent@server1.com "/home/backup_agent/dbbackup.sh" # use scp to securely copy the newly archived userdb.tgz file # from server 1. Note the use of the date command to timestamp # the file on the offsite data server. /usr/bin/scp backup_agent@server1.com:/home/backup_agent/userdb.tgz /home/backups/userdb-$(date +%Y%m%d-%H%M%S).tgz # execute dbbackup.sh on server 2 /usr/bin/ssh backup_agent@server2.com "/home/backup_agent/dbbackup.sh" # use scp to transfer transdb.tgz to offsite server. /usr/bin/scp backup_agent@server2.com:/home/backup_agent/transdb.tgz /home/backups/transdb-$(date +%Y%m%d-%H%M%S).tgz
清單 11. 用在離線的數(shù)據(jù)服務(wù)器上的 backup_remote_servers.sh shell 腳本 backup_remote_servers.sh shell 腳本使用 ssh 命令來(lái)執(zhí)行遠(yuǎn)程服務(wù)器上的腳本。由于我們已經(jīng)設(shè)置的無(wú)密碼的訪問(wèn),ssh 命令可以通過(guò)離線的服務(wù)器在服務(wù)器 1 和 2 上遠(yuǎn)程地執(zhí)行命令。感謝 keychain,整個(gè)認(rèn)證過(guò)程現(xiàn)在可以自動(dòng)完成。調(diào)度
我們的下一個(gè)步驟,也是最后一個(gè)步驟,是調(diào)度 backup_remote_servers.sh shell 腳本在離線的數(shù)據(jù)存儲(chǔ)服務(wù)器上的執(zhí)行。我們將向 cron 調(diào)度服務(wù)器中添加兩個(gè)條目,以要求每天執(zhí)行備份腳本兩次,3:34 執(zhí)行一次,8:34 再執(zhí)行一次。在離線的服務(wù)器上使用 edit(-e)選項(xiàng)調(diào)用 crontab 程序。
[offsite]:$ crontab -e
crontab 調(diào)用 VISUAL 或 EDITOR shell 環(huán)境變量所指定的默認(rèn)的編輯器。然后,輸入兩個(gè)條目并保存和關(guān)閉文件。
34 3 * * * /home/backups/remote_db_backup.sh 34 20 * * * /home/backups/remote_db_backup.sh
清單 12. 離線的服務(wù)器上的 Crontab 條目一個(gè) crontab 行包括兩個(gè)主要部分,時(shí)間表部分和后面的命令部分。時(shí)間表分為多個(gè)域,用來(lái)指定一個(gè)命令應(yīng)該何時(shí)執(zhí)行:
+---- minute | +----- hour | | +------ day of the month | | | +------ month | | | | +---- day of the week | | | | | +-- command to execute | | | | | | 34 3 * * * /home/backups/remote_db_backup.sh
清單 13. Crontab 格式檢驗(yàn)?zāi)膫浞?
您應(yīng)該對(duì)備份進(jìn)行例行地檢查,以確保程序正確進(jìn)行。自動(dòng)程序可以使煩瑣的工作得到避免,但是永遠(yuǎn)不能因此而懶惰。如果您的數(shù)據(jù)值得備份,那么它也值得您時(shí)常進(jìn)行抽樣檢查。
考慮添加一個(gè) cron 作業(yè)來(lái)提醒您自己至少每個(gè)月對(duì)備份進(jìn)行一次檢查。另外,經(jīng)常修改安全密鑰也是一個(gè)好主意,同樣您也可以調(diào)度一個(gè) cron 作業(yè)來(lái)提醒您做這件事。
另外的安全防范
要獲得更高的安全性,可以考慮在每臺(tái)機(jī)器上安裝并配置一個(gè)入侵檢測(cè)系統(tǒng)(ntrusion Detection System,IDS),比如 Snort。可以預(yù)見,當(dāng)入侵正在發(fā)生或者近期發(fā)生過(guò)時(shí),IDS 將會(huì)通知您。IDS 到位后,您將可以添加其他層次上的安全,比如對(duì)您的備份進(jìn)行數(shù)字簽名和加密。
GNU Privacy Guard(GnuPG)、OpenSSL 和 ncrypt 等流行的開放源代碼工具可以支持通過(guò) shell 腳本對(duì)存檔文件進(jìn)行加密,不過(guò)不建議在沒(méi)有 IDS 提供的額外層次保護(hù)的情況下這樣做(參閱 參考資料 以獲得關(guān)于 Snort 的更多信息)。
結(jié)束語(yǔ)
本文向您展示了如何讓您的腳本在遠(yuǎn)程服務(wù)器執(zhí)行以及如何執(zhí)行安全自動(dòng)的文件傳輸。我希望您能由此得到靈感而開始考慮保護(hù)您自己的重要數(shù)據(jù),并使用 OpenSSH 和 Snort 等開放源代碼工具來(lái)構(gòu)建新的解決方案。