Czy istnieją obiektywnie lepsze sposoby tworzenia plików tymczasowych w skryptach bash?
Zwykle nadaję im nazwę, cokolwiek przyjdzie mi do głowy, na przykład plik tymczasowy-123, ponieważ zostanie usunięty po zakończeniu skryptu. Czy jest to jakaś wada inna niż zastąpienie możliwego pliku tymczasowego-123 w bieżącym folderze? A może jest jakaś korzyść z ostrożniejszego tworzenia pliku tymczasowego?
tempfile(1)
w systemach, które go mają.Odpowiedzi:
mktemp(1)
Strona podręcznika opisuje go dość dobrze:W skrypcie wywołuję mktemp w stylu
który tworzy katalog tymczasowy, w którym mogę pracować, iw którym mogę bezpiecznie nazwać rzeczywiste pliki jako czytelne i przydatne.
mktemp
nie jest standardem, ale istnieje na wielu platformach. „X” na ogół zostanie zamienione na pewną przypadkowość, a więcej będzie prawdopodobnie bardziej losowych; jednak niektóre systemy (na przykład popiół busybox) ograniczają tę losowość bardziej niż inneNawiasem mówiąc, bezpieczne tworzenie plików tymczasowych jest ważne nie tylko przy tworzeniu skryptów powłoki. Dlatego python ma plik tymczasowy , perl ma File :: Temp , ruby ma plik tymczasowy itp.
źródło
mktemp
jest połączenie zbasename
, jak na przykładmktemp -dt "$(basename $0). XXXXXXXXXX"
. Jeśli zostanie użyty bezbasename
ciebie, może pojawić się błąd taki jak ten mktemp: nieprawidłowy szablon, `/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX ', zawiera separator katalogu .mktemp -dt "$(basename $0).XXXXXXXXXX"
jest właściwą drogą.$0
, w krainie OS X jest mnóstwo miejsc.mktemp -dt "$(basename "$0").XXXXXX"
trap "rm -rf $mydir" EXIT
Tak, użyj mktemp .
Utworzy plik tymczasowy w folderze przeznaczonym do przechowywania plików tymczasowych i zagwarantuje unikalną nazwę. Wyświetla nazwę tego pliku:
źródło
Możesz chcieć spojrzeć
mktemp
Więcej informacji: man mktemp
źródło
Pliki tymczasowe są zwykle tworzone w katalogu tymczasowym (takim jak
/tmp
), w którym wszyscy inni użytkownicy i procesy mają dostęp do odczytu i zapisu (każdy inny skrypt może tam tworzyć nowe pliki). Dlatego skrypt powinien uważać przy tworzeniu plików, takich jak używanie z odpowiednimi uprawnieniami (np. Tylko do odczytu dla właściciela, zobaczhelp umask
:), a nazwa pliku nie powinna być łatwa do odgadnięcia (najlepiej losowa). W przeciwnym razie, jeśli nazwy plików nie są unikalne, może to spowodować konflikt z tym samym skryptem uruchamianym wiele razy (np. Sytuacja wyścigu) lub osoba atakująca może albo przejąć niektóre poufne informacje (np. gdy uprawnienia są zbyt otwarte, a nazwa pliku jest łatwa do odgadnięcia) lub utworzyć / zamienić plik na własną wersję kodu (np. zastąpienie poleceń lub zapytań SQL w zależności od tego, co jest przechowywane).Możesz użyć następującego podejścia, aby utworzyć katalog tymczasowy:
lub plik tymczasowy:
Jednak nadal jest przewidywalny i nie jest uważany za bezpieczny.
Jak na
man mktemp
to możemy przeczytać:Dlatego dla bezpieczeństwa zaleca się użycie
mktemp
polecenia do utworzenia unikalnego pliku lub katalogu tymczasowego (-d
).źródło
${0##*/}
i$$
rozwinięcie lub link do jakiejś dokumentacji na ten temat.mktemp
jest prawdopodobnie najbardziej wszechstronny, zwłaszcza jeśli planujesz trochę pracować z plikiem.Możesz również użyć operatora podstawiania procesu,
<()
jeśli potrzebujesz pliku tylko tymczasowo jako dane wejściowe dla innego polecenia, np .:źródło