我不明白mktemp
的功能和臨時文件的含義。爲什麼我們需要mktemp?
請告訴我(除了一個事實,即mktemp
將創建XXX追加到它的一些文件,將有600個權限)
說touch xyz
和mktemp xyz
之間的區別,請澄清。
我不明白mktemp
的功能和臨時文件的含義。爲什麼我們需要mktemp?
請告訴我(除了一個事實,即mktemp
將創建XXX追加到它的一些文件,將有600個權限)
說touch xyz
和mktemp xyz
之間的區別,請澄清。
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
攻擊將無法正常工作。
我不同意。將敏感數據放入/ tmp的根運行腳本應該確保它首先創建具有足夠限制性權限的文件;即使使用mktemp,「攻擊者」也可以繼續掃描/ tmp以獲取可讀文件。安全性不是mktemp的主要目的;這是爲了確保同一個程序的多個實例不會破壞每個其他臨時文件。 – Lqueryvg 2014-11-28 22:31:23
@Lqueryvg:當然這是一種安全措施。請從CERT和許多其他與主題相關的文檔中查看CWE-377和「臨時文件 - CERT安全編碼標準」。 – 2014-11-29 05:08:36
原始問題是爲什麼使用mktemp而不是使用 「說」觸摸命令創建文件。答案是避免名稱衝突 - 這可能會導致不可預知的行爲和數據損壞(例如,如果腳本的兩個實例同時運行)。當然,安全性也必須考慮,但這不是mktemp的存在理由。 – Lqueryvg 2014-11-29 11:27:54
你經常需要一個「暫存文件」(或目錄)。此外,您可能需要同時使用多個這樣的文件,而且您不想費心去弄清楚如何命名這些文件,因此沒有衝突。
「mktemp的」 符合該法案:)
這是最正確的答案。這不是關於安全。主要原因是要確保相同的 程序或腳本(可能由相同或不同用戶運行) 的多個實例不會覆蓋彼此的臨時運行時數據。 – Lqueryvg 2014-11-28 22:17:59
你自己回答了這個問題:mktemp()
保證了唯一的名稱。
http://linux.die.net/man/3/mktemp
的mktemp的()函數生成從 模板一個唯一的臨時文件名。模板的最後六個字符必須是XXXXXX,而這些 將替換爲使文件名唯一的字符串。
但是,@ MarcB的評論(和手冊頁)指出,你不應該使用它:你應該使用mkstemp()來代替。
這個問題似乎是在詢問有關'mktemp'命令的問題,在第1節中有記錄,而不是第3節中記錄的'mktemp()'庫函數。前者的手冊頁不需要任何警告不要使用它。 – qqx 2014-04-02 12:50:25
其實它確實寫在手冊頁。
mktemp - 創建一個臨時文件或目錄。
安全地創建臨時文件或目錄並打印其名稱。
它創建一個文件或目錄的安全意味着沒有其他用戶可以訪問它,這就是爲什麼它的權限是600
觸摸 - 修改文件時間戳
它只是改變的時間戳如果已經創建了文件,並且創建文件(如果不存在)。但是文件權限默認仍然是644。
欲瞭解更多詳細覈查以下手冊頁:
至少在bash shell中,你可以這樣做:
dirpath="/tmp/dir1-$$/dir2-$$"
mkdir -p $dirpath
chmod -R 0700 /tmp/dir1-$$
例如。
還有一個額外的原因:並非所有系統都使用/tmp
作爲臨時目錄。 例如https://termux.com/由於技術原因(它作爲Android內部的進程運行),具有不同的長路徑,因爲它是tmp目錄。
使用mktemp
創建臨時文件或目錄的腳本將是可移植的,並且也可以在這樣的特殊環境中工作。
@MarcB原來的問題似乎在詢問'mktemp'命令是否會在shell腳本中使用。這是安全的。這是在編譯的程序中使用的'mktemp'庫函數,這是不安全的。這與操作系統的現代化程度無關,它從來不是安全的,而是最初沒有實現。 – qqx 2014-04-02 12:48:37