Menentukan apakah sistem file atau partisi di-mount RO atau RW melalui Bash Script?

37

Apakah ada cara mudah untuk menentukan apakah sistem file yang dipasang dipasang sebagai Read-Only atau Read-Write? Saya berpikir hanya untuk pipa mounttetapi saya pikir mungkin ada cara yang lebih mudah.

Jake Wilson
sumber
1
Panggilan sistem yang ideal untuk ini adalah statvfsyang antara lain mengembalikan bidang bendera dengan bendera yang menunjukkan mount hanya baca. Sayangnya saya tidak tahu perintah shell untuk melakukan ini secara langsung. Saya akan menggunakan stat -f, tetapi perintah itu menunjukkan segalanya kecuali bendera.
kasperd
2
Catatan: seperti @Travis Campbell membantu dalam komentarnya di serverfault.com/a/277449/236916 , mounttidak selalu memberi tahu Anda apa yang Anda inginkan: untuk parafrase, bunyinya dari /etc/mtab, yang merupakan versi data yang di-cache, dan mungkin menjadi usang dalam beberapa kasus. Info di /proc/mountsadalah yang Anda inginkan.
mwfearnley

Jawaban:

51

Kapal kecil ini akan mengeluarkan sesuatu jika sistem file ro ada.

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

Dengan asumsi Anda biasanya tidak memiliki sistem file ro seperti CD di drive, itu sudah cukup untuk beberapa hal jenis pemantauan dasar dan tidak perlu mengubah sistem file untuk menemukan keadaan saat ini. Itu juga tidak menganggap tipe sistem file Anda. Pipa ke grep -v iso9660 jika Anda ingin menyimpan CD Anda dari catatan.

flickerfly
sumber
1
Saya harus menggunakan grep -P "\sro[\s,]" /proc/mountsataugrep " ro[ ,]" /proc/mounts
WhiteKnight
3
Ini adalah jawaban yang jauh lebih baik daripada terima kasih "coba dan buat file".
Vagnerr
Bukankah ini hanya memberi tahu Anda opsi yang digunakan untuk me-mount, bukan status saat ini? Misalnya entri dengan opsi ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0disetel ke remount sebagai hanya baca jika terjadi kesalahan, jadi tanpa memeriksa mountAnda tidak tahu apakah remount itu telah terjadi, maka jika itu sebenarnya saat ini sedang dalam ro.
Walf
Itu belum pengalaman saya.
flickerfly
3
Saya baru saja mendapatkannya hari ini. Ini adalah sistem file root di ro, tapi ini baru ketika dimulai. $ grep "\sro[\s,]" /proc/mountsOutput:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly
11

Pertanyaan lama, tapi saya sudah menemukannya mencari bantuan yang sama dan sepertinya menemukan cara yang lebih mudah tanpa perlu membuat file.

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

Tentu saja, root-ro adalah ro mount fs dan root-rw adalah rw fs.

pengguna156888
sumber
3
Itu tampaknya menguji izin filesystem, tetapi tidak me-mount status.
Robert Calhoun
1
Benar, tetapi sangat sederhana dan dapat bekerja untuk beberapa kasus (seperti milik saya).
Yajo
Dari man dashuntuk -wopsi - 'File tidak dapat ditulisi pada sistem file read-only bahkan jika tes ini menunjukkan benar.' AFAIK ini sama untuk kerang lainnya.
Graeme
7

Jika sistem file di-mount, saya akan cd ke direktori sementara dan mencoba untuk membuat file. Kode pengembalian akan memberi tahu Anda jika sistem file Read-Only atau Read-Write asalkan sistem file tidak penuh (terima kasih Willem).

David Harris
sumber
1
Jika Anda hanya memeriksa untuk melihat bagaimana file files dipasang, mendapatkan output dari mount sudah cukup. Tapi saya harus setuju, ini cara yang lebih lengkap untuk memeriksanya. Ada kalanya mount dapat melaporkan bahwa ia sudah di-mount baca / tulis, tetapi sebenarnya hanya baca-saja. Contoh umum dari ini adalah sejumlah besar kesalahan SCSI pada perangkat yang menyebabkannya melindungi dirinya sendiri dengan hanya baca-saja. Membuat file akan memverifikasi read + write / read-only tanpa keraguan.
Alex
1
ini akan menjadi rapi:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
glenn jackman
Scriplet yang ditulis memiliki kondisi lomba. Saya akan menggunakan FILE = mktemp -p /filesystem/of/interest/alih-alih hanya menggunakan 'afile' untuk menghasilkan file dan nama file. terbaik
Rik Schneider
1
Ini akan salah melaporkan sistem file lengkap sebagai read-only.
Willem
@ David, Sepertinya ini hack sementara bukan solusi yang benar.
Pacerier
4

Saya baru saja mengalami masalah ini dan ini adalah pasta nyata ...

Lihatlah / 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 - Kedua partisi ini ditampilkan sebagai mount rw ketika hanya menggunakan perintah mount.

Wayne
sumber
2
Ini tidak akan berfungsi jika 'ro' adalah satu-satunya opsi mount
Willem
3

Berdasarkan jawaban flickerdfly , dipengaruhi oleh komentar dari WhiteKnight

Buat fungsi pendeteksi lalat.

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

gunakan itu untuk menentukan apakah path pada read only fs

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

Dan buang itu setelah selesai

#dump temp function
unset -f is_readonly;
tidak disinkronkan
sumber
1

Ini solusinya:

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

Misalnya, untuk memeriksa apakah partisi root dalam mode Read-Only:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi
Jaime M.
sumber
2
Ini tidak mencakup semua kasus. / sbin / mount akan melihat / etc / mtab untuk versi cache dari filesystem yang saat ini dipasang (dan pilihannya saat ini). Jika / mengatur untuk me-remount ro karena suatu alasan, mtab mungkin tidak diperbarui dengan benar, sehingga / saya masih muncul. / proc / mounts harus selalu menunjukkan nilai yang benar.
Travis Campbell
1
Saya setuju dengan kebutuhan untuk menggunakan / proc / mounts. Saya pikir tes ini harus dikurangi menjadi shell (bash karena OP meminta itu) fungsi yang memastikan string yang direferensikan bukan substring dari jalur lain.
Skaperen
0

Mirip dengan Antonio, Anda dapat menggunakan / proc / mounts untuk melakukan hal yang sama. Gunakan drive Anda sendiri di tempat sda4.

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

randyman99
sumber