Xác định xem hệ thống tập tin hoặc phân vùng được gắn RO hoặc RW thông qua Bash Script?


37

Có một cách dễ dàng để xác định xem một hệ thống tập tin được gắn kết được gắn kết là Chỉ đọc hoặc Đọc-Viết? Tôi đã suy nghĩ chỉ để đường ống mountnhưng tôi nghĩ có thể có một cách dễ dàng hơn.


1
Cuộc gọi hệ thống lý tưởng cho điều này sẽ là statvfstrong số những thứ khác trả về một trường cờ với cờ cho biết giá treo chỉ đọc. Thật không may, tôi không biết một lệnh shell để làm điều này trực tiếp. Tôi đã sử dụng stat -f, nhưng lệnh đó cho thấy tất cả mọi thứ trừ cờ.
kasperd

2
Lưu ý: như @Travis Campbell giải thích một cách hữu ích trong nhận xét của mình về serverfault.com/a/277449/236916 , mountkhông phải lúc nào cũng cho bạn biết những gì bạn muốn: để diễn giải, nó đọc từ /etc/mtab, đó là phiên bản được lưu trong bộ nhớ cache của dữ liệu và có thể bị lỗi thời trong một số trường hợp. Thông tin trong /proc/mountslà những gì bạn thực sự muốn.
mwfearnley

Câu trả lời:


50

Một lớp lót nhỏ này sẽ bật ra một cái gì đó nếu một hệ thống tập tin ro tồn tại.

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

Giả sử bạn thường không có hệ thống tệp ro như đĩa CD trong ổ đĩa, nó đủ cho một số loại công cụ giám sát cơ bản và không yêu cầu thay đổi hệ thống tệp để tìm trạng thái hiện tại. Nó cũng không giả sử loại hệ thống tập tin của bạn. Đưa nó vào grep -v iso9660 nếu bạn muốn giữ đĩa CD của mình khỏi bản ghi.


1
Tôi đã phải sử dụng grep -P "\sro[\s,]" /proc/mountshoặcgrep " ro[ ,]" /proc/mounts
WhiteKnight

3
Đây là một câu trả lời tốt hơn nhiều so với "thử và tạo một tập tin" thankyou.
Vagnerr

Điều này không chỉ cho bạn biết các tùy chọn đã được sử dụng để gắn kết chứ không phải trạng thái hiện tại? Ví dụ như một mục với các tùy chọn ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0được thiết lập để đi ngược lại như chỉ đọc trong trường hợp xảy ra lỗi, vì vậy mà không kiểm tra mountbạn không biết nếu đi ngược lại đã xảy ra, do đó nếu nó là trong thực tế hiện tại ro.
Walf

Nó không phải kinh nghiệm của tôi.
flickerfly

3
Tôi chỉ có một ngày hôm nay. Đây là hệ thống tập tin gốc trong ro, nhưng nó đã được rw khi nó bắt đầu. $ grep "\sro[\s,]" /proc/mountsĐầu ra:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly

11

Câu hỏi cũ, nhưng tôi đã bắt gặp nó đang tìm kiếm sự giúp đỡ tương tự và dường như tìm thấy cách dễ dàng hơn mà không cần phải tạo tệp.

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

Tất nhiên, root-ro là ro gắn fs và root-rw là rw fs.


3
Điều đó dường như để kiểm tra quyền hệ thống tập tin, nhưng không gắn kết trạng thái.
Robert Calhoun

1
Đúng, nhưng nó rất đơn giản và có thể hoạt động trong một số trường hợp (như của tôi).
Yajo

Từ man dashcho -wtùy chọn - 'Các tập tin không cho phép ghi trên một hệ thống tập tin chỉ đọc ngay cả khi thử nghiệm này cho thấy sự thật.' AFAIK này là tương tự cho các vỏ khác.
Graeme

7

Nếu hệ thống tệp được gắn kết, tôi sẽ cd vào một thư mục tạm thời và cố gắng tạo một tệp. Mã trả về sẽ cho bạn biết nếu hệ thống tệp là Chỉ đọc hoặc Đọc-ghi với điều kiện hệ thống tệp không đầy đủ (cảm ơn Willem).


1
Nếu bạn chỉ kiểm tra xem tập tin được gắn kết như thế nào, thì việc lấy đầu ra từ mount là đủ. Nhưng tôi phải đồng ý, đây là một cách kiểm tra toàn diện hơn. Có những lần mount có thể báo cáo rằng nó được gắn đọc / ghi, nhưng thực ra chỉ đọc. Một ví dụ phổ biến về điều này là một số lượng lớn lỗi SCSI trên thiết bị khiến thiết bị tự bảo vệ bằng cách chỉ đọc. Tạo một tệp sẽ xác minh đọc + ghi / chỉ đọc mà không có nghi ngờ.
Alex

1
cái này sẽ gọn gàng hơn:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
glenn jackman

Các scriptlet như được viết có một điều kiện chủng tộc. Tôi sẽ sử dụng FILE = mktemp -p /filesystem/of/interest/thay vì chỉ sử dụng 'afile' để tạo tệp và tên tệp. tốt nhất
Rik Schneider

1
Điều này sẽ báo cáo không chính xác một hệ thống tập tin đầy đủ dưới dạng chỉ đọc.
Willem

@David, Đây có vẻ như là một hack stopgap thay vì một giải pháp thực sự.
Pacerier

4

Tôi chỉ có vấn đề này và đây là những miếng dán thực sự ...

Hãy xem / 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 - Hai phân vùng này hiển thị như được gắn rw khi chỉ sử dụng lệnh mount.


2
Điều này sẽ không hoạt động nếu 'ro' là tùy chọn gắn kết duy nhất
Willem

3

Dựa trên câu trả lời của flickerdfly , bị ảnh hưởng bởi một nhận xét từ WhiteKnight

Tạo một chức năng dò tìm con ruồi.

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

sử dụng nó để xác định xem một đường dẫn có trên fs chỉ đọc không

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

Và vứt bỏ nó khi hoàn thành

#dump temp function
unset -f is_readonly;

1

Đây là giải pháp của tôi:

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

0

Ví dụ: để kiểm tra xem phân vùng gốc có ở chế độ Chỉ đọc không:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi

2
Điều này không bắt tất cả các trường hợp. / sbin / mount sẽ xem xét / etc / mtab cho phiên bản được lưu trong bộ nhớ cache của các hệ thống tệp hiện được gắn (và các tùy chọn hiện tại của chúng). Nếu / quản lý để truy cập ro vì một số lý do, mtab có thể không được cập nhật chính xác, vì vậy / có thể xuất hiện rw vẫn. / Proc / mounts luôn luôn hiển thị giá trị chính xác.
Travis Campbell

1
Tôi đồng ý với nhu cầu sử dụng / Proc / mounts. Tôi nghĩ rằng bài kiểm tra này nên được giảm xuống thành shell (bash vì hàm OP yêu cầu điều đó) để đảm bảo chuỗi được tham chiếu không phải là chuỗi con của một đường dẫn khác.
Skaperen

0

Tương tự như Antonio, bạn có thể sử dụng / Proc / mounts để làm điều tương tự. Sử dụng ổ đĩa của riêng bạn thay cho sda4.

mèo / Proc / gắn kết | grep / dev / sda4 | awk '{đế in ($ 4,1,2)}'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.