W jaki sposób w skrypcie powłoki mogę w łatwy i nieinwazyjny sposób sprawdzać dostęp do zapisu do pliku bez faktycznej próby modyfikacji pliku?
Mógłbym przeanalizować dane wyjściowe stat
, ale wydaje się to naprawdę skomplikowane i być może kruche, chociaż nie jestem pewien, jak wiele danych statystycznych różni się w zależności od implementacji i czasu.
Mógłbym dołączyć na końcu pliku i sprawdzić, czy to się powiedzie, ale to potencjalnie niebezpieczne, z dwóch powodów, o których mogę myśleć:
- Teraz muszę usunąć dodatek, a jeśli jakiś inny proces zapisuje do pliku, to natychmiast staje się nietrywialne, ponieważ moja linia nie jest już ostatnią.
- Każdy proces odczytywający plik może mieć dowolne wymagania dotyczące zawartości tego pliku, a ja właśnie mogłem zepsuć tę aplikację.
źródło
man test
lubman [
type -a
test
zastosowań źródłowych,euidaccess
które po prostu sprawdzają bity uprawnień . Czy nie istnieją inne czynniki (np. SELinux), które mogą zabronić dostępu do zapisu?&&
i||
mają równy priorytet. Są oceniane od lewej do prawej.Inne podejście:
Spowoduje to próbę otwarcia pliku w celu dołączenia, a jeśli to się powiedzie, nie uruchom żadnej komendy (tj. Uruchom komendę zerową ) z wyjściem do pliku.
Uważaj, aby utworzyć pusty plik, jeśli nie istniał.
-w
Operatortest
polecenia może po prostu zrobićstat
, a następnie spróbuj dowiedzieć się, czy wygląda na to trzeba mieć dostęp. Moja alternatywa (powyżej) jest bardziej niezawodna niżtest
podejście w niektórych specjalnych warunkach, ponieważ wymusza sprawdzenie dostępu przez jądro, a nie powłokę. Na przykład,stat
może zwrócić mylącą wartość trybu.źródło
touch
utworzyć plik, który posiadałem, ale nie miałem dostępu do zapisu, i udało się. Myślę, że tochmod
plik ichmod
to z powrotem. Więctouch
wydaje się być absolutnie bezużyteczne jako odpowiedź na pytanie.vim
zachowuje się tak, że szybko zmienia uprawnienia, gdy jest zmuszony pisać na plikach tylko do odczytu. Sprawdziłemstrace
,touch
jestopen
nie zEACCES
, ale późniejsze wywołanieutimensat
się powiedzie, dlatego myślę, żetouch
na całych wyjść pomyślnie.utimensat(2)
mówi: „ Wymagania dotyczące uprawnień: 1. dostęp do zapisu (lub) 2. efektywny identyfikator użytkownika dzwoniącego musi być zgodny z właścicielem pliku,…”.>> file
nie jest przenośny (na przykład uruchamia NULLCMD w zsh), użyjtrue >> file
zamiast tego. A jeśli plik ma nazwane potoki, ma nieprzyjemne skutki uboczne.G-man ma rację:
[ -w ]
nie zawsze mówi prawdę. Tutaj, aby poradzić sobie z nieistniejącym plikiem i wiadomością odmowy uprawnień z powłoki:Aktualizacja : Wygląda przerażająco, prawda? No cóż, tak jest. Hmm ... jak to sformułować ... NIE UŻYWAJ TEGO, chyba że doskonale wiesz, że jesteś w warunkach, w których wymaga on działania zgodnie z oczekiwaniami. Zobacz komentarz Stephane'a.
Co zatem wyciągnąć wniosek? Nawet jeśli
[ -w ]
nie mówi prawdy, jest to jedno polecenie, które ma wykonać zadanie. Jeśli tak się nie stanie, będziemy go winić, pisać raporty o błędach i będzie działać w przyszłości. Lepiej sprawdź warunki, w jakich działa i używa[ -w ]
; napisz specjalny kod dla specjalnych przypadków. Obejścia mają swoje własne warunki.jest najlepszy a priori .
źródło
test -w
w większości zastosowań implementacyjnychaccess(2)
powinno wystarczyć do przetestowania uprawnień.