Czy możemy używać folderów tymczasowych, takich jak pliki tymczasowe
TMP=$(mktemp ... )
exec 3<>$TMP
rm $TMP
cat <&3
które zostaną zniszczone automatycznie po wyjściu z tej powłoki?
file-descriptors
tmpfs
Bob Johnson
źródło
źródło
Odpowiedzi:
W przypadku pliku tymczasowego twój przykład w pytaniu utworzy go, a następnie odłączy go od katalogu (sprawiając, że „zniknie”), a gdy skrypt zamknie deskryptor plików (prawdopodobnie po zakończeniu), miejsce zajmowane przez plik byłby możliwy do odzyskania przez system. Jest to powszechny sposób postępowania z plikami tymczasowymi w językach takich jak C.
O ile mi wiadomo, nie można otworzyć katalogu w ten sam sposób, a przynajmniej nie w żaden sposób, który uczyniłby katalog użytecznym.
Częstym sposobem usuwania plików tymczasowych i katalogów po zakończeniu skryptu jest zainstalowanie
EXIT
pułapki czyszczenia . Poniższe przykłady kodu pozwalają uniknąć konieczności żonglowania deskryptorami plików.Lub możesz wywołać funkcję czyszczenia:
EXIT
Pułapka nie zostanie wykonana po otrzymaniuKILL
sygnału (który nie może być uwięziony), co oznacza, że nie będzie żadnego czyszczenia wykonywane wtedy. Będzie on jednak wykonywany po zakończeniu z powodu sygnałuINT
lubTERM
(jeśli działa zbash
lubksh
w innych powłokach, możesz chcieć dodać te sygnały poEXIT
wtrap
wierszu poleceń), lub gdy kończy się normalnie z powodu dojścia do końca skryptu lub wykonaniaexit
połączenie.źródło
.
i..
. (Testowany w systemie Linux, nie wiem, czy jest spójny na różnych platformach).exec another-command
oczywiście.Napisz funkcję powłoki, która zostanie wykonana po zakończeniu skryptu. W poniższym przykładzie nazywam to „porządkiem” i ustawiam pułapkę do wykonania na poziomach wyjścia, np .: 0 1 2 3 6
Zobacz ten post, aby uzyskać więcej informacji.
źródło
cleanup
przed czystym wyjściem (0) i po otrzymaniu SIGHUP (1), SIGINT (2), SIGQUIT (3) i SIGABRT (6). będzie nie działaćcleanup
, gdy wychodzi script powodu SIGTERM, SIGSEGV, SIGKILL, SIGPIPE itp Jest to wyraźnie niewystarczające.Możesz do niego przejść, a następnie go usunąć, pod warunkiem, że później nie będziesz próbował używać ścieżek:
Nie sprawdziłem, ale najprawdopodobniej ten sam problem występuje podczas używania openat (2) w C z katalogiem, który już nie istnieje w systemie plików.
Jeśli jesteś rootem i na Linuksie, możesz grać z oddzielną przestrzenią nazw i
mount -t tmpfs tmpfs /dir
wewnątrz niej.Odpowiedzi kanoniczne (ustaw pułapkę na EXIT) nie działają, jeśli twój skrypt jest zmuszony do nieczystego wyjścia (np. Za pomocą SIGKILL); które mogą pozostawić wrażliwe dane.
Aktualizacja:
Oto małe narzędzie, które implementuje podejście do przestrzeni nazw. Należy go skompilować
i dane
CAP_SYS_ADMIN
możliwości pliku (jako root) za pomocąPo uruchomieniu (jako normalny) użytkownik jako
usunie udostępnienie przestrzeni nazw systemu plików, zamontuje system plików tmpfs
/proc/sysvipc
, chdir i uruchomicommand
podane argumenty.command
będzie nie dziedzicząCAP_SYS_ADMIN
możliwości.Ten system plików nie będzie dostępny z innego procesu, od którego nie został uruchomiony
command
, i magicznie zniknie (wraz ze wszystkimi plikami, które zostały w nim utworzone), kiedycommand
i jego dzieci umrą, bez względu na to, jak to się stanie. Zauważ, że jest to po prostu udostępnianie przestrzeni nazw montowania - nie ma twardych barier międzycommand
innymi procesami uruchamianymi przez tego samego użytkownika; wciąż mogli się zakraść w przestrzeni nazw albo przezptrace(2)
,/proc/PID/cwd
albo w inny sposób.Porwanie „bezużytecznego”
/proc/sysvipc
jest oczywiście głupie, ale alternatywą byłoby spamowanie/tmp
pustymi katalogami, które należałoby usunąć lub znacznie komplikować ten mały program widelcami i czekaniem. Alternatywniedir
można zmienić na np./mnt/chtmp
i niech utworzy go root podczas instalacji; nie konfiguruj go i nie ustawiaj na ścieżkę należącą do użytkownika, ponieważ może to narazić Cię na pułapki dowiązań symbolicznych i inne włochate rzeczy, na których nie warto spędzać czasu.chtmp.c
źródło
rm $PWD
praca, skorupa wciąż jest w tym katalogu. Ale w tym „folderze” nie można umieszczać nowych plików. Jedyne, co możesz zrobić, to odczyt / zapis za pomocą plików i 3 oraz 4. Jest to więc nadal „plik tymczasowy”, a nie „folder tymczasowy”.Czy potrzebujesz konkretnej powłoki?
Jeśli zsh jest opcją, przeczytaj
zshexpn(1)
:Na przykład używam tego w karabinie (część menedżera plików ranger), aby odszyfrować plik, a następnie uruchomić karabin na pliku tymczasowym, który zostanie usunięty po zakończeniu podprocesów. (nie zapomnij ustawić
$TERMCMD
)źródło