前言
在我們日常開發中經常會需要用到臨時文件,本文就給大家介紹了關于Shell建立與使用臨時性文件的相關內容,分享出來供大家參考學習,話不多說了,來一起看看詳細的介紹:
雖然使用管道可以省去建立臨時性文件的需求,不過有時候臨時性文件還是派的上用場的。UNIX不同于其他操作系統的地方就是:它沒有那種將不再需要的文件設法神奇刪除的想法。反倒提供了兩個特殊目錄:/tmp和/var/tmp(舊系統為:/usr/tmp),這些文件可正常被存儲,當它們未被清理干凈時也不會弄亂一般的目錄。大部分系統上的/tmp都會在系統開機時清空,不過/var/tmp下的重新開機時仍需存在,因為有些文本編輯程序,會將它們的備份文件存放在這里,從而系統毀損后可用來恢復數據。
因為/tmp目錄使用頻繁,有些系統就會將它放在常駐內存型的文件系統里,以便快速訪問,如下面這個例子:
root@localhost:~/training# df /tmp Filesystem 1K-blocks Used Available Use% Mounted on swap 568048704 10772216 528398256 2% /tmp
將文件系統放在替換空間區域里,表示它存在于內存中,直到內存資源消耗殆盡時,部分數據才會寫入替換空間。
為確保臨時性文件會在任務完成時刪除,編譯語言的程序員可以先開啟文件,再下達unlink()系統調用。這么做就會馬上刪除文件,但因為它仍在開啟狀態,所以仍可繼續訪問,直到文件關閉或工作結束為止,只要其中一個先發生即可。打開后解除連接的技巧一般來說在非UNIX操作系統下是無法運行的,在加載于UNIX文件系統中目錄上的外部文件系統也是這樣,且在大多數腳本語言中無法使用它。
$$變量
共享的目錄或同一個程序的多個執行實例,都可能造成文件名沖突,在Shell腳本里的傳統做法就是使用進程ID,可以在Shell變量$$中取得,構建成臨時性文件名的一部分。要解決完整臨時性文件名發生問題的可能性,可使用環境變量覆蓋目錄名稱,通常是TMPDIR。另外,你也應該使用trap命令,要求在工作完成時刪除臨時性文件,因此,常見的Shell腳本起始如下:
umask 077 # 刪除用戶以外其他人的所有訪問權 TMPFILE=${TMPDIR-/tmp}/myprog.$$ # 產生臨時性文件名 trap 'rm -f $TMPFILE' EXIT # 完成時刪除臨時性文件 mktemp程序
像/tmp/myprog.$$這樣的文件名會有這個問題:太好猜了!攻擊者只需要在目標程序執行時列出目錄幾次,就可以找出它正在使用的是哪些臨時性文件。通過預先建立適當的指定文件,攻擊者可以讓你的程序失敗或讀取偽造的數據,甚至重設文件權限,以便于攻擊者讀取文件。
處理此類安全性議題時,文件名必須是不可預知的。BSD與GUN/Linux系統都提供了mktemp命令,供用戶建立難以猜測的臨時性文件名稱。雖然底層的mktemp()函數庫調用已由POSIX標準化,但mktemp命令卻沒有。如果你的系統沒有mktemp,我們建議你安裝OpenBSD的可移植版本
新聞熱點
疑難解答