linux - mktemp




在意外的bash退出中刪除創建的臨時文件 (5)

使用帶有$$的可預測文件名的替代方案是一個巨大的安全漏洞,您永遠不應該考慮使用它。 即使它只是您單個用戶PC上的簡單個人腳本。 這是一個你不應該獲得的非常壞的習慣。 BugTraq充滿了“不安全的臨時文件”事件。 有關臨時文件安全性方面的更多信息,請參見hereherehere

我最初想的是引用不安全的TMP1和TMP2任務,但第二個想法可能不是一個好主意

我正在從bash腳本創建臨時文件。 我在處理結束時刪除它們,但由於腳本運行了很長時間,如果我在運行期間將其刪除或只是CTRL-C,則不會刪除臨時文件。
有沒有辦法在執行結束之前捕獲這些事件並清理文件?

此外,這些臨時文件的命名和位置是否有某種最佳實踐?
我目前還不確定使用:

TMP1=`mktemp -p /tmp`
TMP2=`mktemp -p /tmp`
...

TMP1=/tmp/`basename $0`1.$$
TMP2=/tmp/`basename $0`2.$$
...

或者是否有更好的解決方案?


您不必費心去除使用mktemp創建的tmp文件。 它們將在以後被刪除。

如果可以,請使用mktemp,因為它會生成更多唯一文件,然後是'$$'前綴。 它看起來像是創建臨時文件的更多跨平台方式,然後明確地將它們放入/ tmp。


您希望使用trap命令來處理退出腳本或CTRL-C之類的信號。 有關詳細信息,請參閱Advanced Bash Scripting Guide

對於你的臨時文件,使用basename $0是一個好主意,同時提供一個模板,為足夠的臨時文件提供空間:

tempfile() {
    tempprefix=$(basename "$0")
    mktemp /tmp/${tempprefix}.XXXXXX
}

TMP1=$(tempfile)
TMP2=$(tempfile)

trap 'rm -f $TMP1 $TMP2' EXIT

我更喜歡使用tempfile ,它以安全的方式在/ tmp中創建一個文件,你不必擔心它的命名:

tmp=$(tempfile -s "your_sufix")
trap "rm -f '$tmp'" exit

請記住,選擇答案是bashism ,這意味著解決方案

trap "{ rm -f $LOCKFILE }" EXIT

只能在bash中工作(如果shell是dash或經典sh ,它將不會捕獲Ctrl + c),但是如果你想要兼容性,那麼你仍然需要枚舉你想要捕獲的所有信號。

還要記住,當腳本退出陷阱時,始終執行信號“0”(也稱為EXIT),導致trap命令的雙重執行。

如果存在EXIT信號,則不將所有信號堆疊在一行中的原因。

為了更好地理解它,請查看以下腳本,該腳本可以在不進行更改的情

#!/bin/sh

on_exit() {
  echo 'Cleaning up...(remove tmp files, etc)'
}

on_preExit() {
  echo
  echo 'Exiting...' # Runs just before actual exit,
                    # shell will execute EXIT(0) after finishing this function
                    # that we hook also in on_exit function
  exit 2
}


trap on_exit EXIT                           # EXIT = 0
trap on_preExit HUP INT QUIT TERM STOP PWR  # 1 2 3 15 30


sleep 3 # some actual code...

exit 

此解決方案將為您提供更多控制,因為您可以在最終退出( preExit函數)之前運行實際信號時運行一些代碼,如果需要,您可以在實際EXIT信號(退出的最後階段)運行一些代碼





temporary-files