2012-07-24 123 views
36

我不明白mktemp的功能和臨時文件的含義。爲什麼我們需要mktemp?

請告訴我(除了一個事實,即mktemp將創建XXX追加到它的一些文件,將有600個權限)

touch xyzmktemp xyz之間的區別,請澄清。

+7

@MarcB原來的問題似乎在詢問'mktemp'命令是否會在shell腳本中使用。這是安全的。這是在編譯的程序中使用的'mktemp'庫函數,這是不安全的。這與操作系統的現代化程度無關,它從來不是安全的,而是最初沒有實現。 – qqx 2014-04-02 12:48:37

回答

44

mktemp隨機化名稱。 從安全角度來看這非常重要。

試想一下,你做這樣的事情:

echo something > /tmp/temporary-file 

在你的root運行的腳本。

有一個人(誰看了你的腳本)不

ln -s /etc/passwd /tmp/temporary-file 

mktemp命令可以幫助你在這種情況下:

TEMP=$(mktemp /tmp/temporary-file.XXXXXXXX) 
echo something > ${TEMP} 

現在這個ln /etc/passwd攻擊將無法正常工作。

+14

我不同意。將敏感數據放入/ tmp的根運行腳本應該確保它首先創建具有足夠限制性權限的文件;即使使用mktemp,「攻擊者」也可以繼續掃描/ tmp以獲取可讀文件。安全性不是mktemp的主要目的;這是爲了確保同一個程序的多個實例不會破壞每個其他臨時文件。 – Lqueryvg 2014-11-28 22:31:23

+1

@Lqueryvg:當然這是一種安全措施。請從CERT和許多其他與主題相關的文檔中查看CWE-377和「臨時文件 - CERT安全編碼標準」。 – 2014-11-29 05:08:36

+4

原始問題是爲什麼使用mktemp而不是使用 「說」觸摸命令創建文件。答案是避免名稱衝突 - 這可能會導致不可預知的行爲和數據損壞(例如,如果腳本的兩個實例同時運行)。當然,安全性也必須考慮,但這不是mktemp的存在理由。 – Lqueryvg 2014-11-29 11:27:54

12

你經常需要一個「暫存文件」(或目錄)。此外,您可能需要同時使用多個這樣的文件,而且您不想費心去弄清楚如何命名這些文件,因此沒有衝突。

「mktemp的」 符合該法案:)

+3

這是最正確的答案。這不是關於安全。主要原因是要確保相同的 程序或腳本(可能由相同或不同用戶運行) 的多個實例不會覆蓋彼此的臨時運行時數據。 – Lqueryvg 2014-11-28 22:17:59

9

你自己回答了這個問題:mktemp()保證了唯一的名稱。

http://linux.die.net/man/3/mktemp

的mktemp的()函數生成從 模板一個唯一的臨時文件名。模板的最後六個字符必須是XXXXXX,而這些 將替換爲使文件名唯一的字符串。

但是,@ MarcB的評論(和手冊頁)指出,你不應該使用它:你應該使用mkstemp()來代替。

+6

這個問題似乎是在詢問有關'mktemp'命令的問題,在第1節中有記錄,而不是第3節中記錄的'mktemp()'庫函數。前者的手冊頁不需要任何警告不要使用它。 – qqx 2014-04-02 12:50:25

6

其實它確實寫在手冊頁。

mktemp - 創建一個臨時文件或目錄。

安全地創建臨時文件或目錄並打印其名稱。

它創建一個文件或目錄的安全意味着沒有其他用戶可以訪問它,這就是爲什麼它的權限是600

觸摸 - 修改文件時間戳

它只是改變的時間戳如果已經創建了文件,並且創建文件(如果不存在)。但是文件權限默認仍然是644。

欲瞭解更多詳細覈查以下手冊頁:

http://linux.die.net/man/1/mktemp

http://linux.die.net/man/1/touch

0

至少在bash shell中,你可以這樣做:

dirpath="/tmp/dir1-$$/dir2-$$" 
mkdir -p $dirpath 
chmod -R 0700 /tmp/dir1-$$ 

例如。

2

還有一個額外的原因:並非所有系統都使用/tmp作爲臨時目錄。 例如https://termux.com/由於技術原因(它作爲Android內部的進程運行),具有不同的長路徑,因爲它是tmp目錄。

使用mktemp創建臨時文件或目錄的腳本將是可移植的,並且也可以在這樣的特殊環境中工作。