keychain shell 腳本太長以致于無法在本文中列出,因為精心編寫的腳本中包括了很多錯誤檢測、豐富的文檔以及非常多的跨平臺代碼。不過,keychain 可以自項目的 Web 站點上方便地下載得到(參閱 參考資料 以獲得鏈接)。
下載并安裝了 keychain 后,使用它就很簡單了。只需要登錄到每臺機器并將下面兩行添加到每個 .bash_profile 文件:
keychain id_dsa . ~/.keychain/$HOSTNAME-sh
在您第一次重新登錄到每臺機器時,keychain 將向您詢問口令。不過,除非機器被重新啟動,否則,以后再登錄時,keychain 將不會再要求您重新輸入口令。最好的是,cron 任務現在可以使用 OpenSSH 命令來安全地訪問遠程的機器,而不需要交互地使用口令。更好的安全和更容易的使用,現在我們已經兼得。
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. 在每臺機器上初始化腳本化備份過程
我們的下一個任務是創建執行必要的備份過程的 shell 腳本。目標是執行服務器 1 和 2 的完全數據庫備份。在我們的例子中,每個服務器都運行著 MySQL 數據庫服務器,我們使用 mysqldump 命令行工具來將一些數據庫表導出到一個 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. 服務器 1 的 dbbackup.sh shell 腳本在服務器 2 上,我們將設置一個類似的腳本來備份站點數據庫中給出的獨有表單。每個腳本都通過下面的步驟標記為可執行的:
[server1]:$ chmod +x dbbackup.sh
在服務器 1 和 2 上設置了 dbbackup.sh 后,我們返回到離線的數據服務器,在那里我們將創建一個 shell 腳本來調用各個遠程 dbbackup.sh 腳本并隨后傳輸壓縮的(.tgz)數據文件。
#!/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. 用在離線的數據服務器上的 backup_remote_servers.sh shell 腳本 backup_remote_servers.sh shell 腳本使用 ssh 命令來執行遠程服務器上的腳本。由于我們已經設置的無密碼的訪問,ssh 命令可以通過離線的服務器在服務器 1 和 2 上遠程地執行命令。感謝 keychain,整個認證過程現在可以自動完成。調度
我們的下一個步驟,也是最后一個步驟,是調度 backup_remote_servers.sh shell 腳本在離線的數據存儲服務器上的執行。我們將向 cron 調度服務器中添加兩個條目,以要求每天執行備份腳本兩次,3:34 執行一次,8:34 再執行一次。在離線的服務器上使用 edit(-e)選項調用 crontab 程序。
[offsite]:$ crontab -e
crontab 調用 VISUAL 或 EDITOR shell 環境變量所指定的默認的編輯器。然后,輸入兩個條目并保存和關閉文件。
34 3 * * * /home/backups/remote_db_backup.sh 34 20 * * * /home/backups/remote_db_backup.sh
清單 12. 離線的服務器上的 Crontab 條目一個 crontab 行包括兩個主要部分,時間表部分和后面的命令部分。時間表分為多個域,用來指定一個命令應該何時執行:
+---- minute | +----- hour | | +------ day of the month | | | +------ month | | | | +---- day of the week | | | | | +-- command to execute | | | | | | 34 3 * * * /home/backups/remote_db_backup.sh
清單 13. Crontab 格式檢驗您的備份
您應該對備份進行例行地檢查,以確保程序正確進行。自動程序可以使煩瑣的工作得到避免,但是永遠不能因此而懶惰。如果您的數據值得備份,那么它也值得您時常進行抽樣檢查。
考慮添加一個 cron 作業來提醒您自己至少每個月對備份進行一次檢查。另外,經常修改安全密鑰也是一個好主意,同樣您也可以調度一個 cron 作業來提醒您做這件事。
另外的安全防范
要獲得更高的安全性,可以考慮在每臺機器上安裝并配置一個入侵檢測系統(ntrusion Detection System,IDS),比如 Snort??梢灶A見,當入侵正在發生或者近期發生過時,IDS 將會通知您。IDS 到位后,您將可以添加其他層次上的安全,比如對您的備份進行數字簽名和加密。
GNU Privacy Guard(GnuPG)、OpenSSL 和 ncrypt 等流行的開放源代碼工具可以支持通過 shell 腳本對存檔文件進行加密,不過不建議在沒有 IDS 提供的額外層次保護的情況下這樣做(參閱 參考資料 以獲得關于 Snort 的更多信息)。
結束語
本文向您展示了如何讓您的腳本在遠程服務器執行以及如何執行安全自動的文件傳輸。我希望您能由此得到靈感而開始考慮保護您自己的重要數據,并使用 OpenSSH 和 Snort 等開放源代碼工具來構建新的解決方案。