Tutoriel Linux

Mktemp Linux : vytvořit bezpečný dočasný soubor

Débutant3 min de lecture

Skript, které zapisuje do /tmp/rapport.txt, nakonec vytváří problém: jiný proces již může používat toto jméno a místní uživatel může připravit symbolický odkaz vaším jménem. mktemp vytváří soubor nebo adresář s nepředvídatelným názvem a okamžitě jej rezervuje pro skript.

Použijte dočasný soubor pro meziprodukt a poté ho vyčistěte pomocí trap. Skript tak udržuje svůj adresář čistý i v případě chyby nebo přerušení.

Bezpečný dočasný adresář v prostředí Linux
Dočasný adresář vytvořený pro skript a poté řádně vyčištěný.

Nevyrábějte název pomocí $$

Tato stará zvyklost zůstává riskantní:

tmp="/tmp/rapport-$$.txt"
echo "výsledek" > "$tmp"

PID nedělá jméno tajným a soubor není vytvořen v okamžiku, kdy jej počítáte. Mezi konstrukcí cesty a zápisem může jiný proces obsadit toto jméno. mktemp vytváří objekt, než vám vrátí jeho cestu.

tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" rapport.XXXXXX) || exit 1
printf '%sn' "výsledek" > "$tmp_file"

Šablona musí obsahovat alespoň tři X po sobě jdoucí v poslední komponentě. Znaky jsou při vytváření nahrazeny. Vždy uchovávejte uvozovky kolem proměnné: TMPDIR může obsahovat mezeru.

Vytvořte dočasný adresář pro více souborů

Dočasný adresář zabrání rozptýlení více souborů v /tmp. Je to užitečné pro připravovanou archivaci, konverzi nebo zprávu, která produkuje meziprodukty.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" záloha.XXXXXX) || exit 1
printf '%sn' "data" > "$workdir/liste.txt"
tar -czf "$workdir/rapport.tar.gz" "$workdir/liste.txt"

Většina systémů vytváří tento adresář s právy vyhrazenými pro váš účet. Zkontrolujte to, když skript manipuluje s klíčem, exportem nebo archivem obsahujícím citlivá data:

stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"

Čistěte pomocí trap bez vymazání špatné cesty

Nastavte funkci pro úklid hned po vytvoření adresáře. Ověřte, že proměnná existuje a správně ukazuje na očekávaný adresář před voláním rm -rf.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" můj-skript.XXXXXX) || exit 1
cleanup() {
  [ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM

# zpracování skriptu zde

trap ... EXIT spustí úklid, když shell končí. Signály HUP, INT a TERM pokrývají obvyklá přerušení. Násilné zastavení pomocí kill -9 nedává shellu čas na provedení této funkce, je tedy třeba také plánovat kontrolovaný úklid pro větší zpracování.

  • vytvářejte cestu pomocí mktemp, nikdy pomocí data nebo $$;
  • použijte mktemp -d, pokud skript produkuje více souborů;
  • odstraňte pouze proměnnou, kterou skript vytvořil a ověřil;
  • uchovejte dočasný soubor, pokud musíte diagnostikovat selhání, a pak jej po analýze odstraňte.

Návod na historii Bash pomáhá zabránit tomu, aby heslo zadané na příkazovém řádku zůstalo v ~/.bash_history. Pro archivaci konečného výsledku se podívejte také na vytvoření a extrakci archivu tar pod Linuxem.

sudo apt update && sudo apt upgrade