Przeczytałem, że przekierowanie danych wyjściowych do pliku o stałej nazwie /tmp
może stanowić zagrożenie bezpieczeństwa, ponieważ jeśli atakujący (lub malkontent) zauważy, że plik /tmp/tmpfileformyscript.tmp
jest tworzony po uruchomieniu skryptu (nawet jeśli nie ma on dostępu do odczytu skrypt), może na przykład utworzyć dowiązanie symboliczne, ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmp
które spowoduje, że zniszczę .bashrc
plik po uruchomieniu skryptu.
Zamiast tego mogę użyć czegoś takiego filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"
.
Chciałbym jednak czasami użyć pliku tmp do buforowania, w którym to przypadku chciałbym wiedzieć, czy „tmpfile.tmp. *” Pasuje do czegoś, /tmp
a jeśli tak, użyj tego pliku zamiast tworzyć nowy. Niestety, test
o [ -f filename ]
ile mi wiadomo, odpowiednik nie obsługuje globowania plików.
Zatem moje pytanie jest dwojakie:
- Jak mogę bezpiecznie utworzyć plik tymczasowy? Czy
"predictablename.$RANDOM"
możliwa jest do przyjęcia praktyka lub czy istnieje lepszy (bezpieczniejszy, łatwiejszy) sposób? - Jak mogę łatwo uzyskać dostęp do pliku i / lub ustalić jego istnienie później, sprawdzając go
predictablename
?
źródło
$TMPDIR
i~/.cache
jest dokładnie tym, czego potrzebowałem. Po kilku dalszych myślach zdałem sobie sprawę, że jedynym powodem, dla którego chciałem to zrobić,/tmp
był podział na partycje - więc pamięć podręczna nie mogła zapełnić/home
partycji. Ale w tym przypadku użycia jest to kompletny problem, więc podkatalog~/.cache
idealnie pasuje do moich potrzeb i pozwala uniknąć problemu z bezpieczeństwem.mktemp
nie jest dostępny w systemie AIX ani w powłoce Git w systemie Windows. Wygląda nafile.$RANDOM$RANDOM
to, że jest to rozwiązanie przenośne.$RANDOM$RANDOM
Powinno zwiększyć przestrzeń do 2 ^ 32, przy założeniu, atakujących losowe są one niezależne i nie słaby.mktemp został do tego zaprojektowany. Ze strony podręcznika:
mktemp utworzy plik lub zakończy działanie z niezerowym statusem wyjścia. Logiczne lub (||) zapewnia, że skrypt zakończy działanie, jeśli mktemp nie będzie mógł utworzyć pliku. Po tym poleceniu możesz być pewien, że plik jest dostępny. Nie ma potrzeby sprawdzania tego ponownie. Jedyne, co może być konieczne do dodania, to oczyszczenie pliku na końcu skryptu.
I być może także wtedy, gdy skrypt zakończy się sygnałem. To, czy jest to konieczne, czy nie, należy do decyzji.
Oba można wykonać za pomocą
trap
polecenia.źródło
$RANDOM
. Ale potem część druga mojego pytania - jak mogę uzyskać dostęp do tego pliku później lub sprawdzić, czy istnieje on już przy kolejnym uruchomieniu skryptu? (Aby wdrożyć bardzo prostą pamięć podręczną.)