2012-06-11 11 views
111

Czy istnieją obiektywnie lepsze sposoby tworzenia plików tymczasowych w skryptach Bash?Tworzenie plików tymczasowych w bash

Zazwyczaj po prostu nazywam je tym, co przychodzi mi na myśl, na przykład tempfile-123, ponieważ zostanie usunięte po zakończeniu skryptu. Czy jest jakaś wada w tym innym niż zastąpienie możliwego tempfile-123 w bieżącym folderze? Czy istnieje jakaś przewaga przy tworzeniu pliku tymczasowego w bardziej ostrożny sposób?

+0

Nie używaj plików tymczasowych. Zamiast tego używaj tymczasowych katalogów. I nie używaj mktemp. Zobacz tutaj, dlaczego: http://www.codeproject.com/Articles/15956/Security-Tips-for-Temporary-File-Usage-in-Applicat – ceving

+14

@ceving Ten artykuł jest po prostu błędny, przynajmniej po zastosowaniu do polecenia powłoki mktemp (w przeciwieństwie do wywołania biblioteki mktemp). Ponieważ mktemp tworzy sam plik z ograniczoną umaską, atak ten działa tylko wtedy, gdy atakujący działa na tym samym koncie, co atakujący ... w takim przypadku gra jest już stracona. Aby uzyskać najlepsze praktyki w świecie skryptów powłoki, zobacz http://mywiki.wooledge.org/BashFAQ/062 –

+0

Możesz również użyć 'tempfile (1)' na systemach, które go mają. –

Odpowiedz

135

Strona mktemp(1) człowiek tłumaczy go dość dobrze:

Tradycyjnie wiele skryptów powłoki przybrać nazwę programu z PID jako przyrostek i użytkowania to jako tymczasowa nazwa pliku. Ten rodzaj schematu nazewnictwa jest przewidywalny, a warunki wyścigu, które tworzy, są łatwe do wygrania przez atakującego. Bezpieczniejszym, choć wciąż gorszym podejściem jest utworzenie katalogu tymczasowego z użyciem tego samego schematu nazewnictwa. Podczas gdy pozwala to zagwarantować, że plik tymczasowy nie zostanie poddany podokresowi, nadal pozwala na prosty atak typu "odmowa usługi". W przypadku z tych powodów sugeruje się użycie mktemp.

W skrypcie modlę mktemp coś podobnego

mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX") 

która tworzy katalog tymczasowy mogę pracować w, w których mogę spokojnie nazwać rzeczywiste pliki coś czytelną i użyteczną.

mktemp nie jest standardem, ale istnieje na wielu platformach. "X" na ogół zostaną przekształcone w losowość, a więcej będzie prawdopodobnie bardziej przypadkowych; Jednak niektóre systemy (ash BusyBox dla jednego) ograniczyć tę przypadkowość znacznie więcej niż inni


nawiasem mówiąc, bezpieczne tworzenie plików tymczasowych jest ważne dla więcej niż tylko skrypty powłoki.Dlatego python ma tempfile, Perl ma File::Temp, Ruby ma Tempfile, etc ...

+1

Opcja -t jest przestarzała: http://www.gnu.org/support/manual/html_node/mktemp-invocation.html –

+1

@TeaBee nie na OS X. – kojiro

+6

Wydaje się być najbardziej bezpiecznym i najbardziej międzyplatformowym sposób użycia 'mktemp' jest w połączeniu z' podstawową', jak np. 'mktemp -dt" $ (basename $ 0). XXXXXXXXXX "'. Jeśli użyjesz go bez 'podstawowej nazwy ', możesz otrzymać błąd taki jak ten _mktemp: nieprawidłowy szablon,' /tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX', zawiera katalog separator_. – i4niac

15

Możecie zajrzeć do mktemp

Narzędzie mktemp zajmuje dany szablon nazw plików i nadpisuje porcję tego, aby stworzyć unikalną nazwę. Szablon może być dowolną nazwą pliku z pewną liczbą dołączonych "X", na przykład /tmp/tfile.XXXXXXXXXX. Końcowe "X" są zastępowane kombinacją bieżącego numeru procesu i losowych liter.

Aby uzyskać więcej informacji: man mktemp

26

Tak, użyj mktemp.

Spowoduje to utworzenie tymczasowego pliku w folderze przeznaczonym do przechowywania plików tymczasowych, a także zagwarantuje unikalną nazwę. Wyprowadza nazwę tego pliku:

> mktemp 
/tmp/tmp.xx4mM3ePQY 
> 
9

Czy jest jakaś zaleta tworzenia pliku tymczasowego w sposób bardziej staranny sposób

Pliki tymczasowe są zazwyczaj tworzone w katalog tymczasowy (taki jak /tmp), w którym wszyscy inni użytkownicy i procesy mają dostęp do odczytu i zapisu (każdy inny skrypt może utworzyć nowe pliki). Dlatego skrypt powinien być ostrożny w tworzeniu plików, takich jak używanie z odpowiednimi uprawnieniami (np. Tylko do odczytu dla właściciela, patrz: help umask) i nazwa pliku powinna być trudna do odgadnięcia (idealnie losowa). W przeciwnym razie, jeśli nazwy plików nie są unikalne, może stworzyć konflikt z tym samym skryptem uruchamianym wiele razy (np. race condition) lub jakiś atakujący może albo porwać niektóre poufne informacje (np. Gdy uprawnienia są zbyt otwarte i nazwa pliku jest łatwa do odgadnięcia) lub utworzyć/zastępowanie pliku własną wersją kodu (np. zastępowanie poleceń lub zapytań SQL w zależności od tego, co jest przechowywane).


Można używać następujące podejście do tworzenia katalogu tymczasowego:

TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR" 

lub plik tymczasowy:

TMPFILE=".${0##*/}-$$" && touch "$TMPFILE" 

Jednak wciąż jest przewidywalny i nie uważane za bezpieczne.

Zgodnie man mktemp, możemy przeczytać:

Tradycyjnie wiele skryptów powłoki przyjąć nazwę programu z PID jako przyrostek i użyć jej jako tymczasową nazwą. Ten schemat nazewnictwa jest przewidywalny, a warunki wyścigu, które stwarza, są łatwe do wygrania przez atakującego.

więc pewności, zaleca się użyć polecenia mktemp stworzyć niepowtarzalny tymczasowy plik lub katalog (-d).

+2

nie dokładnie to, o co pytano. Jednak może to być idealne rozwiązanie. – jpbochi

+1

@jpbochi Ulepszyłem odpowiedź, aby odpowiedzieć na pytanie. Jeśli to pomoże, to daj mi znać. – kenorb

+0

Naprawdę poprawia to odpowiedź. Moje uptorzenie było już jednak twoje. Nie można głosować więcej. Jedną z sugestii, którą mam, jest wyjaśnienie, co '$ {0 ## * /}' i '$$' rozwinięcie, lub link do jakiejś dokumentacji na jej temat. – jpbochi

Powiązane problemy