czy istnieje gwarancja / tmp?


42

Czy muszę sprawdzić i utworzyć /tmpprzed zapisem w pliku w nim zawartym? Załóżmy, że nikt nie uciekł, sudo rm -rf /tmpponieważ jest to bardzo rzadki przypadek


16
Co rozumiesz przez „gwarantowane”? FHS tego wymaga, więc każda dystrybucja zgodna z FHS miałaby to. Istnieje jednak wiele dystrybucji specjalnego przeznaczenia, które nie są zgodne z FHS. Z pewnością możliwe jest utworzenie dystrybucji Unix / Linux bez / tmp, ale to, czy musisz się tym przejmować, zależy od tego, czy zależy ci na wsparciu tych systemów.
Lie Ryan,

1
Dlaczego nie utworzyć własnego tymczasowego katalogu i usunąć go, gdy skończysz, zamiast polegać na następnym uruchomieniu w celu wyczyszczenia?
WGroleau

4
@WGroleau Nie wiem o OP, ale na skryptach piszę dla własnego systemu, zwykle umieszczam pliki tymczasowe w podkatalogu /tmp(utworzonym z mktemp), a następnie usuwam ten podkatalog przy wyjściu. Większość mojego systemu jest zamontowana w trybie tylko do odczytu, dzięki czemu nie muszę pamiętać cdo katalogu, w którym można zapisywać
Fox,

1
@WGroleau Nie polegam na ponownym uruchomieniu komputera, aby go wyczyścić. że mktempwygląda naprawdę świetnie, i'l prawdopodobnie skończyć przy użyciu tego.
Ayush

7
@jamesqf Tak, ponowne uruchomienie nie jest wymagane do wyczyszczenia /tmp. I odwrotnie, jest to dozwolone i przypuszczalnie WGroleau zbytnio ekstrapolował. Mój /tmpjest tmpfsprzechowywany w pamięci RAM, więc zostaje wyłączony po wyłączeniu. To jednak tylko szczegół systemu, którego FHS nie gwarantuje. Tak więc, zgodnie z pierwotnym komentarzem, głupotą jest poleganie na obecności lub braku czegokolwiek /tmppomiędzy butami.
underscore_d

Odpowiedzi:


60

W FHS mandaty, które /tmpistnieją, podobnie jak POSIX , więc można liczyć na jej tam być (przynajmniej na systemach zgodnych, ale naprawdę to dość dużo gwarancją obecny na systemach uniksowych). Ale nie powinieneś: administrator systemu lub użytkownik może preferować inne lokalizacje plików tymczasowych. Aby uzyskać więcej informacji, zobacz Znajdowanie prawidłowego katalogu tmp na wielu platformach .


Jest to oczywiście błąd konstrukcyjny. /tmpto imię. $TMPDIRto inne imię. Jeśli nie możesz liczyć na /tmpprawidłową nazwę katalogu tymczasowego, dlaczego możesz liczyć na $TMPDIRnazwę odpowiedniej zmiennej środowiskowej? Dlaczego nie powinienem sprawdzać, $TMPDIRVARaby uzyskać nazwę tej zmiennej? Jeden poziom pośredni jest wystarczający i /tmpdokładnie taki jest. Nie mówi nic o faktycznym miejscu do przechowywania, to tylko nazwa.
MSalters

@MSalters to coś więcej. Przed przestrzeniami nazw $TMPDIRkażdy użytkownik mógł mieć oddzielny katalog tymczasowy, a nawet używać różnych katalogów tymczasowych dla różnych programów; jeden /tmptego nie zapewnia (ponownie, bez przestrzeni nazw lub czegoś podobnego). Należy również wziąć pod uwagę wiele historii (lub dziedzictwa).
Stephen Kitt

Dla użytkownika jest to ważna kwestia, ale dlatego ~/tmpdo tego celu posłużyłby dobry projekt . Co /tmpoczywiście może być tą samą fizyczną lokalizacją .
MSalters

44

W praktyce /tmpistnieje gwarancja, że ​​istnieje. Jednak nawet jeśli istnieje, nie oznacza to, że powinieneś umieścić tam pliki tymczasowe.

Standardowy konwencja jest użycie TMPDIRzmiennej środowiskowej. Jeśli istnieje, wskazuje katalog plików tymczasowych. Jeśli nie istnieje, włóż pliki tymczasowe /tmp.

W skrypcie powłoki można użyć "${TMPDIR:-/tmp}"jako tymczasowej lokalizacji pliku: rozwija się ona do wartości TMPDIRif jest ustawiona¹, a w /tmpprzeciwnym razie. Lub możesz ustawić TMPDIRwarunkowo, jeśli jest rozbrojony, za pomocą polecenia

: "${TMPDIR:=/tmp}"

a następnie utwórz pliki tymczasowe w środku "$TMPDIR".

Pamiętaj, że każda aplikacja może tworzyć pliki w ramach /tmplub $TMPDIR. Ponadto ten katalog może być współużytkowany przez użytkowników, więc musisz zadbać o uprawnienia podczas tworzenia pliku. Wiele systemów (Linux, * BSD) ma polecenie, mktempktóre bezpiecznie tworzy pliki we właściwym katalogu. Zasadniczo dobrym pomysłem jest mktemptworzenie tymczasowych plików i katalogów - szczególnie ze skryptu powłoki, w którym niemożliwe jest bezpieczne utworzenie pliku we współdzielonym katalogu ze względu na możliwość ataków z użyciem dowiązań symbolicznych ( mkdirjest w porządku, jeśli poprawnie obsługuje się błędy).

¹ i niepuste - jeśli zmienna jest pusta, to i tak nie nadaje się do użytku, i ogólnie dobrym pomysłem jest traktowanie pustych lub nieustawionych zmiennych w ten sam sposób, jeśli mają zawierać nazwę pliku.


11
Może mógłbyś wspomnieć, że użytkownicy muszą spodziewać się kolizji nazw plików. Tak więc IMO jedynym zalecanym sposobem tworzenia plików w / tmp jest polecenie, które mktemppowinno także automatycznie obsługiwać $ TMPDIR ".
rudimeier 29.04.17

To jest odpowiedź, którą chcesz. Widziałem systemy bez / bin nie mówiąc już o / tmp.
Joshua

1
Również struktura A.10 katalog i urządzeń stanowi: ... The /tmpkatalog jest utrzymywany w celu dostosowania aplikacji POSIX.1-2008 historycznych, które przejmują jego dostępność. Implementacje są zachęcane do zapewnienia odpowiednich nazw katalogów w zmiennej środowiskowej, TMPDIRa aplikacje są zachęcane do korzystania z zawartości TMPDIRdo tworzenia plików tymczasowych. ...
Andrew Henle,

3
Szkoda tylko, że mktempnie ma go w POSIX, chociaż jest już dostępny w najpopularniejszych systemach operacyjnych, takich jak GNU (Linux) , OpenBSD , FreeBSD i macOS .
Franklin Yu

1
Warto dodać, że mktemppodobne funkcje są dostępne w wielu językach skryptowych i programistycznych, takich jak libc , Perl i Python .
Gaurav

6

Chociaż istnieje prawdopodobieństwo, że istnieje, powinieneś sprawdzić z innego powodu: nie ma gwarancji, że będzie duży . W wielu systemach /tmpjest wspierany przez pamięć RAM, a nie dysk, i prawdopodobnie będzie ograniczony do kilku GB. (W systemach Fedora domyślnie jest to połowa pamięci RAM.) Więc powinieneś sprawdzić nie tylko istnienie, ale czy jest miejsce na umieszczenie tego, co zamierzasz tam umieścić.

Jeśli masz coś dużego, użyj /var/tmp/.


2
Nie jestem pewien, czy jest to „uniksowy sposób” sprawdzania dostępnego miejsca przed kontynuowaniem, zwłaszcza że nie zawsze wiadomo dokładnie, ile miejsca będzie potrzebne. W każdym razie musisz być przygotowany na płynną obsługę błędu zapisu na wypadek, gdyby system plików się zapełnił; a jeśli zamierzasz to zrobić, co zyskasz, przeprowadzając kontrolę z wyprzedzeniem, która będzie podatna na fałszywe negatywy i pozytywy?
Nate Eldredge

2
Zależy, jak wdzięcznie poradzisz sobie z przypadkiem awarii. Najważniejsze jest, aby nie zakładać, że /tmpmożna obsługiwać duże pliki. Powiedzmy, że jest to pobieranie 10 GB za pośrednictwem łącza o umiarkowanej prędkości. „Uniksowy sposób”, czy nie, bardzo przykro jest dowiedzieć się, że kilka godzin nie zadziała.
mattdm

1
@mattdm Sprawdzanie wcześnie jest miłe, ale trzeba rozwiązać problem awarii. Może / tmp ma 10 GB dostępnej pamięci, gdy pobieranie się rozpoczyna, ale inny użytkownik kopiuje tam 5 GB, gdy pobieranie jest uruchomione. Co teraz? Heh
Zan Lynx

Zdecydowanie! Nie mam na myśli tego jako wymówki, by nie radzić sobie z porażką.
mattdm

„Jeśli masz coś dużego” - użyj / tmp i pozwól systemowi zamienić się w razie potrzeby.
UKMonkey
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.