Практически каждый, кому необходимы были временные файлы писал так:
TMP="/tmp/script.$RANDOM"
И вроде все ок, но на деле это один из самых старых и самых недооцененных багов в bash.
▪️ Почему /tmp/file.$RANDOM - это плохая идея
1️⃣ Коллизии.
$RANDOM - это число от 0 до 32767. При параллельном запуске скриптов совпадения реальны.2️⃣ Race condition. Ты:
echo "data" > /tmp/file.$RANDOM
А злоумышленник заранее создал симлинк с таким именем и твой скрипт перезапишет чужой файл. Это классическая symlink attack.
3️⃣ Неправильные права. Файл создается с текущим umask. Это может быть не то, что ты ожидал.
▪️ Правильный способ - mktemp
TMP=$(mktemp)
Результат:
/tmp/tmp.ABCd93kL
Что делает mktemp:
генерирует криптографически безопасное имя
создаёт файл атомарно
выставляет права 600
исключает race condition
▪️ Создание временной директории
TMP_DIR=$(mktemp -d)
▪️ Правильная очистка. Всегда следует добавлять cleanup:
TMP=$(mktemp)
cleanup() {
rm -f "$TMP"
}
trap cleanup EXIT
Теперь файл удалится даже при ошибке или Ctrl+C.
▪️ Когда нужно имя с префиксом
mktemp /tmp/myscript.XXXXXX
Или:
mktemp -d /tmp/myscript.XXXXXX
XXXXXX обязательно - это шаблон.BashTex 📱 #bash #utils