Bestimmen Sie, ob das Dateisystem oder die Partition über Bash Script in RO oder RW eingebunden ist?

37

Gibt es eine einfache Möglichkeit, festzustellen, ob ein bereitgestelltes Dateisystem schreibgeschützt oder schreibgeschützt bereitgestellt ist? Ich dachte nur, um zu pfeifen, mountaber ich dachte, es könnte einen einfacheren Weg geben.

Jake Wilson
quelle
1
Der ideale Systemaufruf hierfür wäre, statvfsdass unter anderem ein Flag-Feld mit einem Flag zurückgegeben wird, das eine Nur-Lese-Bereitstellung anzeigt. Leider kenne ich keinen Shell-Befehl, um dies direkt zu tun. Ich hätte verwendet stat -f, aber dieser Befehl zeigt alles außer Flags.
Kasperd
2
Hinweis: Wie @Travis Campbell in seinem Kommentar zu serverfault.com/a/277449/236916 ausführlich erklärt , mountsagt er Ihnen nicht immer, was Sie wollen: paraphrasieren Sie /etc/mtab, was eine zwischengespeicherte Version der Daten ist und womöglich in einigen Fällen veraltet sein. Die Info in /proc/mountsist das, was Sie wirklich wollen.
Mwfearnley

Antworten:

50

Dieser kleine Einzeiler gibt etwas aus, wenn ein ro-Dateisystem vorhanden ist.

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

Vorausgesetzt, Sie haben normalerweise kein ro-Dateisystem wie eine CD im Laufwerk, ist dies für einige grundlegende Überwachungsaufgaben ausreichend und es ist nicht erforderlich, das Dateisystem zu ändern, um den aktuellen Status zu ermitteln. Es wird auch nicht von Ihrem Dateisystemtyp ausgegangen. Pipe es in grep -v iso9660, wenn Sie Ihre CDs aus der Aufzeichnung heraushalten möchten.

Flackerfliege
quelle
1
Ich musste grep -P "\sro[\s,]" /proc/mountsoder verwendengrep " ro[ ,]" /proc/mounts
WhiteKnight
3
Dies ist eine viel bessere Antwort als "Versuch, eine Datei zu erstellen", danke.
Vagnerr
Sagt Ihnen dies nicht nur die Optionen, die zum Mounten verwendet wurden, und nicht den aktuellen Status? Beispielsweise ist ein Eintrag mit den Optionen ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0so eingestellt, dass er im Fehlerfall als schreibgeschützt erneut bereitgestellt wird. Ohne Überprüfung mountwissen Sie also nicht, ob diese erneute Bereitstellung stattgefunden hat, und ob sie sich aktuell in befindet ro.
Walf
Das war nicht meine Erfahrung.
Flickerfly
3
Ich hatte heute nur einen. Dies ist das Root-Dateisystem in ro, aber es war rw, als es gestartet wurde. $ grep "\sro[\s,]" /proc/mountsAusgabe:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
Flickerfly
11

Alte Frage, aber ich bin auf der Suche nach der gleichen Hilfe darauf gestoßen und es scheint, als ob es noch einfacher wäre, ohne eine Datei zu erstellen.

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

Natürlich ist root-ro ro montiert fs und root-rw ist rw fs.

user156888
quelle
3
Das scheint die Dateisystemberechtigung zu testen, aber nicht den Ladestatus.
Robert Calhoun
1
Stimmt, aber es ist sehr einfach und kann in einigen Fällen (wie bei mir) funktionieren.
Yajo
Von man dashfür die -wOption - 'Die Datei kann in einem schreibgeschützten Dateisystem nicht geschrieben werden, auch wenn dieser Test true angibt.' AFAIK das ist das gleiche für andere Muscheln.
Graeme
7

Wenn das Dateisystem eingehängt ist, würde ich in ein temporäres Verzeichnis wechseln und versuchen, eine Datei zu erstellen. Der Rückkehrcode gibt an, ob das Dateisystem schreibgeschützt oder schreibgeschützt ist, sofern das Dateisystem nicht voll ist (danke Willem).

David Harris
quelle
1
Wenn Sie nur überprüfen, wie ein Dateisystem eingehängt ist, sollte es ausreichen, die Ausgabe von mount abzurufen. Aber ich muss zustimmen, dies ist eine erschöpfendere Möglichkeit, dies zu überprüfen. Es kann vorkommen, dass mount meldet, dass es schreib- / lesbar ist, aber tatsächlich schreibgeschützt ist. Ein häufiges Beispiel hierfür ist eine große Anzahl von SCSI-Fehlern auf einem Gerät, die dazu führen, dass es sich selbst schreibgeschützt. Durch das Erstellen einer Datei wird zweifelsohne überprüft, ob Lesezugriff + Schreibzugriff / Lesezugriff bestehen.
Alex
1
das wäre ordentlich:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
Glenn Jackman
Das geschriebene Scriptlet hat eine Racebedingung. Ich würde FILE = mktemp -p /filesystem/of/interest/anstelle von 'afile' verwenden, um die Datei und den Dateinamen zu generieren. Beste
Rik Schneider
1
Dadurch wird ein vollständiges Dateisystem fälschlicherweise als schreibgeschützt gemeldet.
Willem
@ David, Dies scheint wie ein Stopgap-Hack anstelle einer echten Lösung.
Pacerier
4

Ich hatte gerade dieses Problem und das sind echte Pasten ...

Schauen Sie sich / proc / mounts an -

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

Zu Ihrer Information: Diese beiden Partitionen werden nur mit dem Befehl mount als eingehängt angezeigt.

Wayne
quelle
2
Dies funktioniert nicht, wenn "ro" die einzige Mount-Option ist
Willem
3

Basiert auf der Antwort einer Flitzerfliege , beeinflusst von einem Kommentar von WhiteKnight

Erstellen Sie im Handumdrehen eine Detektorfunktion.

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

Verwenden Sie diese Option, um festzustellen, ob sich ein Pfad in einem schreibgeschützten Dateisystem befindet

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

Und entsorgen Sie es, wenn Sie fertig sind

#dump temp function
unset -f is_readonly;
nicht synchronisiert
quelle
1

Hier ist meine Lösung:

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

So überprüfen Sie beispielsweise, ob sich die Root-Partition im schreibgeschützten Modus befindet:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi
Jaime M.
quelle
2
Dies erfasst nicht alle Fälle. / sbin / mount sucht in / etc / mtab nach der zwischengespeicherten Version der aktuell gemounteten Dateisysteme (und ihren aktuellen Optionen). Wenn / ro aus irgendeinem Grund erneut gemountet werden kann, wird mtab möglicherweise nicht korrekt aktualisiert, sodass / rw möglicherweise weiterhin angezeigt wird. / proc / mounts sollte aber immer den richtigen Wert anzeigen.
Travis Campbell
1
Ich bin damit einverstanden, dass / proc / mounts verwendet werden muss. Ich denke, dieser Test sollte auf eine Shell-Funktion (Bash) reduziert werden, die sicherstellt, dass die Zeichenfolge, auf die verwiesen wird, keine Teilzeichenfolge eines anderen Pfads ist.
Skaperen
0

Ähnlich wie bei Antonio können Sie mit / proc / mounts dasselbe tun. Verwenden Sie anstelle von sda4 Ihr eigenes Laufwerk.

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

randyman99
quelle