Określić, czy system plików lub partycja jest zamontowana RO czy RW za pomocą skryptu Bash?

37

Czy istnieje prosty sposób ustalenia, czy podłączony system plików jest podłączony jako tylko do odczytu, czy tylko do odczytu? Myślałem tylko o fajce, mountale pomyślałem, że może być prostszy sposób.

Jake Wilson
źródło
1
Idealnym wywołaniem systemowym byłoby to, statvfsktóre między innymi zwraca pola flagi z flagą wskazującą montowanie tylko do odczytu. Niestety nie znam polecenia powłoki, aby to zrobić bezpośrednio. Użyłbym stat -f, ale to polecenie pokazuje wszystko oprócz flag.
kasperd
2
Uwaga: jak @Travis Campbell pomaga w swoim komentarzu na serverfault.com/a/277449/236916 , mountnie zawsze mówi ci, czego chcesz: parafrazować, czyta z /etc/mtab, która jest buforowaną wersją danych i może być nieaktualne w niektórych przypadkach. Informacje w nich /proc/mountssą tym, czego naprawdę chcesz.
mwfearnley

Odpowiedzi:

50

Ten mały linijka coś wyskoczy, jeśli istnieje system plików ro.

grep "[[:space:]]ro[[:space:],]" /proc/mounts 

Zakładając, że zwykle nie masz systemu plików ro, takiego jak CD w napędzie, wystarcza to do podstawowych czynności monitorowania i nie wymaga zmiany systemu plików, aby znaleźć bieżący stan. Nie zakłada również typu systemu plików. Pipuj go do grep -v iso9660, jeśli chcesz zachować swoje płyty CD poza rekordem.

Flickerfly
źródło
1
Musiałem użyć grep -P "\sro[\s,]" /proc/mountslubgrep " ro[ ,]" /proc/mounts
WhiteKnight
3
To jest o wiele lepsza odpowiedź niż „spróbuj utworzyć plik”.
Vagnerr
Czy to nie mówi ci tylko o opcjach użytych do zamontowania, a nie o obecnym stanie? Np. Pozycja z opcjami ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0jest ustawiona na ponowne zamontowanie jako tylko do odczytu w przypadku błędu, więc bez sprawdzania mountnie wiesz, czy ten ponowny montaż wystąpił, a zatem czy faktycznie jest on aktualnie w ro.
Walf
To nie było moje doświadczenie.
flickerfly
3
Właśnie dzisiaj miałem. Jest to główny system plików w ro, ale był on rw podczas uruchamiania. $ grep "\sro[\s,]" /proc/mountsWyjście:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly
11

Stare pytanie, ale natknąłem się na nie, szukając tej samej pomocy i wydaje się, że znalazłem jeszcze łatwiejszy sposób bez potrzeby tworzenia pliku.

    [ -w /root-rw ] && echo "rw" || echo "ro"
    rw
    [ -w /root-ro ] && echo "rw" || echo "ro"
    ro

Oczywiście root-ro to fs montowany na ro, a root-rw to rw fs.

użytkownik156888
źródło
3
To wydaje się sprawdzać uprawnienia systemu plików, ale nie status montowania.
Robert Calhoun
1
To prawda, ale jest to bardzo proste i może działać w niektórych przypadkach (takich jak moje).
Yajo,
Od man dashdla -wopcji - „Pliku nie można zapisać w systemie plików tylko do odczytu, nawet jeśli ten test wskazuje, że jest prawdziwy”. AFAIK to samo dotyczy innych powłok.
Graeme
7

Jeśli system plików jest zamontowany, zapisałbym cd do katalogu tymczasowego i spróbowałem utworzyć plik. Kod powrotu powie ci, czy system plików jest tylko do odczytu, czy tylko do odczytu, pod warunkiem, że system plików nie jest pełny (dzięki Willem).

David Harris
źródło
1
Jeśli tylko sprawdzasz, jak zamontowany jest system plików, uzyskanie wyjścia z montowania powinno wystarczyć. Ale muszę się zgodzić, że jest to bardziej wyczerpujący sposób sprawdzenia. Są sytuacje, w których mount może zgłosić, że jest zamontowany do odczytu / zapisu, ale tak naprawdę jest tylko do odczytu. Typowym tego przykładem jest duża liczba błędów SCSI na urządzeniu, które powodują jego ochronę przez przejście w tryb tylko do odczytu. Utworzenie pliku bez wątpienia zweryfikuje odczyt + zapis / tylko do odczytu.
Alex
1
byłoby to uporządkowane:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
glenn jackman
Zapisany skryptlet ma warunek wyścigu. mktemp -p /filesystem/of/interest/Użyłbym FILE = zamiast po prostu „afile” do wygenerowania pliku i nazwy pliku. najlepiej
Rik Schneider
1
Niepoprawnie zgłosi pełny system plików jako tylko do odczytu.
Willem,
@David, Wydaje się, że jest to hack stopgap zamiast prawdziwego rozwiązania.
Pacerier,
4

Właśnie miałem ten problem i to są prawdziwe pasty ...

Spójrz na / proc / mounts -

egrep " ro,|,ro " /proc/mounts 
/dev/sda3 / ext4 ro,seclabel,relatime,barrier=1,data=ordered 0 0    
/dev/sda5 /var ext4 ro,seclabel,relatime,barrier=1,data=ordered 0 0

FYI - Te dwie partycje pokazują się jako montowane rw, gdy używa się tylko komendy mount.

Wayne
źródło
2
To nie zadziała, jeśli „ro” jest jedyną opcją montowania
Willem
3

Na podstawie odpowiedzi flickerdfly , na którą wpłynął komentarz WhiteKnight

Utwórz funkcję detektora w locie.

eval "function is_readonly () {
          $( grep -P "\sro[\s,]" /proc/mounts | awk '{print "if echo $1 | grep -q \""$2"\"; then return 0;fi"}' )
      return 1;}";    

użyj go, aby ustalić, czy ścieżka znajduje się w trybie tylko do odczytu

is_readonly /path/to/file/on/read/only/fs && echo "sorry. can't delete that"

Po zakończeniu usuń go

#dump temp function
unset -f is_readonly;
niezsynchronizowany
źródło
1

Oto moje rozwiązanie:

if findmnt -n -o OPTIONS ${YOUR_MOUNT_POINT} | egrep "^ro,|,ro,|,ro$"; then
  echo "Read only!"
fi
Antonio Petricca
źródło
0

Na przykład, aby sprawdzić, czy partycja root jest w trybie tylko do odczytu:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi
Jaime M.
źródło
2
To nie obejmuje wszystkich przypadków. / sbin / mount będzie szukał w / etc / mtab pod kątem buforowanej wersji aktualnie podłączonych systemów plików (i ich bieżących opcji). Jeśli / z jakiegoś powodu uda się ponownie zamontować ro, to mtab może nie zostać poprawnie zaktualizowany, więc / może nadal pojawiać się rw. / proc / mounts powinien zawsze pokazywać poprawną wartość.
Travis Campbell,
1
Zgadzam się z potrzebą użycia / proc / mounts. Myślę, że ten test powinien zostać zredukowany do powłoki (bash, ponieważ OP prosi o to), która zapewnia, że ​​ciąg, do którego się odwołujemy, nie jest podciągiem innej ścieżki.
Skaperen
0

Podobnie jak Antonio, możesz użyć / proc / mounts, aby zrobić to samo. Użyj własnego dysku zamiast sda4.

cat / proc / mounts | grep / dev / sda4 | awk '{print substr (4,1,2 $)}'

randyman99
źródło