Tutoriel Linux

Mktemp Linux : utworzyć bezpieczny plik tymczasowy

Débutant3 min de lecture

Skrypt, który zapisuje do /tmp/rapport.txt, może prowadzić do problemu: inny proces może już używać tej nazwy, a lokalny użytkownik może przygotować symboliczne łącze w twoim imieniu. mktemp tworzy plik lub folder z nieprzewidywalną nazwą i natychmiast rezerwuje go dla skryptu.

Użyj pliku tymczasowego do wyjścia pośredniego, a następnie usuń go za pomocą trap. W ten sposób skrypt utrzymuje swoje katalogi w czystości nawet w przypadku błędu lub przerwania.

Bezpieczny folder tymczasowy w środowisku Linux
Tymczasowy folder stworzony dla skryptu, a następnie starannie usunięty.

Nie twórz nazwy z $$

Ten stary nawyk jest nadal ryzykowny:

tmp="/tmp/rapport-$$.txt"
echo "wynik" > "$tmp"

PID nie czyni nazwy tajemną, a plik nie jest tworzony w momencie, gdy go obliczasz. Między tworzeniem ścieżki a zapisem inny proces może zająć tę nazwę. mktemp tworzy obiekt przed zwróceniem jego ścieżki.

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

Szablon musi zawierać co najmniej trzy X z rzędu w swojej ostatniej części. Znaki są zastępowane podczas tworzenia. Zawsze trzymaj cudzysłowy wokół zmiennej: TMPDIR może zawierać spację.

Tworzenie tymczasowego folderu dla wielu plików

Tymczasowy folder zapobiega rozsypaniu wielu plików w /tmp. Jest to przydatne przy przygotowywaniu archiwum, konwersji lub raporcie, który generuje pliki pośrednie.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" backup.XXXXXX) || exit 1
printf '%sn' "dane" > "$workdir/liste.txt"
tar -czf "$workdir/raport.tar.gz" "$workdir/liste.txt"

Większość systemów tworzy ten katalog z uprawnieniami zarezerwowanymi dla twojego konta. Sprawdź to, gdy skrypt obsługuje klucz, eksport lub archiwum z danymi wrażliwymi:

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

Czyszczenie z użyciem trap bez usuwania niewłaściwej ścieżki

Zdefiniuj funkcję czyszczenia tuż po utworzeniu folderu. Sprawdź, czy zmienna istnieje i rzeczywiście wskazuje oczekiwany katalog przed wywołaniem rm -rf.

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

# przetwarzanie skryptu tutaj

trap ... EXIT uruchamia czyszczenie, gdy powłoka kończy działanie. Sygnalizacje HUP, INT i TERM obejmują typowe przerwania. Nagłe zatrzymanie za pomocą kill -9 nie daje powłoce czasu na wykonanie tej funkcji, dlatego należy przewidzieć również kontrolowane czyszczenie dla dużych procesów.

  • twórz ścieżkę za pomocą mktemp, nigdy za pomocą daty lub $$;
  • użyj mktemp -d, jeśli skrypt generuje wiele plików;
  • usuń tylko zmienną stworzoną i zweryfikowaną przez skrypt;
  • zachowaj plik tymczasowy, jeśli musisz zdiagnozować błąd, a następnie usuń go po analizie.

Poradnik na historii Bash pomaga uniknąć wystąpienia hasła podanego w linii poleceń w ~/.bash_history. Aby zarchiwizować ostateczny wynik, sprawdź też tworzenie i rozpakowywanie archiwum tar w systemie Linux.

sudo apt update && sudo apt upgrade