學shell到現在了,一直以為自己不會犯一個大家常說的非常二的問題,結果這本書最后的時候犯了個十分2的事,晚節不保?。。?!我在測試文件路徑下除了通配符*和?外還能用啥正則那樣的東西,結果就在$HOME下執行了rm .* 。。。好吧,蛋疼了一下午!還木找回任何一個配置文件。警示后人,千萬別使用rm試通配符!任何時候小心使用rm!
第十四章shell可移植性議題和擴展
可以先通讀這篇文章。
想寫出好的可移植性shell,不僅要了解各種shell版本間的差異,還要有很多編程技巧,比如盡量從環境變量中獲取需要的信息等。
第十五章安全的shell腳本:起點
安全性shell腳本的提示:
1、不要將當前目錄(點號)置于PATH下??蓤绦谐绦驊撝荒芊旁跇藴实南到y目錄下,將當前目錄放在PATH里,無疑是打開特洛伊木馬(Trojan Horse)的大門。
2、為bin目錄設置保護。確認$PATH下的每一個目錄都只有它的擁有者可以寫入,其余任何人都不能。用樣的道理也應該應用于bin目錄里所有的程序。
3、寫程序前,先想清除?;c時間想想你要做什么,該如何實行。不要一開始就在文字編輯器上寫。錯誤與失敗的優雅處理也應該設計在程序里。
4、應對所有輸入參數檢查其有效性。如果期待的是數字,那就驗證它是數字,并且是否在要求的范圍內。其他的需要也是這樣檢測。
5、對所有可返回錯誤的命令,檢查錯誤處理代碼。不在你預期內的失敗情況,很可能是有問題的強迫失敗,導致腳本出現不當的行為。例如,如果參數為NFS加載磁盤或面向字符的設備文件時,即便是以root的身份執行,也可能導致有些命令失敗。
6、不要信任傳進來的環境變量。如果它們被接下來的命令(如TZ、PATH、IFS等)使用時,請檢查并重設為已知的值。無論在什么情況下,最好的方式就是明確的設置自己需要的(如PATH只包含系統bin目錄,設置IFS為空格定位符和換行)。
7、從已知的地方開始。在腳本開始時,確切cd到已知目錄,這么一來,接下來任何相對路徑名稱才能指到已知位置。確認cd操作成功:cd app-dir || exit 1
8、使用syslog(8)保留審計跟蹤。記錄引用的日期與時間、username等,參見logger(1)的使用手冊。如果沒有logger,可建立一個函數保留日志文件:
代碼如下:
logger(){
printf "%s/n" "$*" >> /var/adm/logsysfile
}
logger "Run by user " $(id -un) "($USER) at " $(/bin/date)
9、當使用該輸入時,一定將用戶輸入引用起來。例如:"$1"與"$*",這么做可以防止居心不良的用戶輸入超出范圍的計算與執行。
10、勿在用戶輸入上使用eval。甚至在引用用戶輸入之后,也不要使用eval將它交給shell再處理。如果用戶讀取了你的腳本,發現你使用eval,就能很輕松的利用這個腳本進行任何破壞。
新聞熱點
疑難解答