ตรวจสอบว่าระบบไฟล์หรือพาร์ติชันติดตั้ง RO หรือ RW ผ่าน Bash Script หรือไม่


37

มีวิธีง่าย ๆ ในการตรวจสอบว่าระบบแฟ้มที่เมาท์ถูกเมาท์เป็นอ่านอย่างเดียวหรืออ่านเขียน ฉันกำลังคิดจะไปป์ไลน์mountแต่ฉันคิดว่าอาจจะมีวิธีที่ง่ายกว่านี้


1
เรียกระบบที่เหมาะสำหรับการนี้จะเป็นstatvfsซึ่งในสิ่งอื่น ๆ ที่ส่งกลับทุ่งธงธงชี้อ่านเท่านั้นติด น่าเสียดายที่ฉันไม่รู้จักคำสั่ง shell เพื่อทำสิ่งนี้โดยตรง ฉันจะใช้stat -fแต่คำสั่งนั้นแสดงทุกอย่างยกเว้นแฟล็ก
kasperd

2
หมายเหตุ: เป็น @Travis แคมป์เบลเป็นประโยชน์อธิบายในความคิดเห็นของเขาในserverfault.com/a/277449/236916 , mountไม่เคยบอกสิ่งที่คุณต้องการที่จะแปลความหมายก็อ่านจาก/etc/mtabซึ่งเป็นรุ่นที่เก็บไว้ของข้อมูลและอาจ ล้าสมัยในบางกรณี ข้อมูลใน/proc/mountsคือสิ่งที่คุณต้องการจริงๆ
mwfearnley

คำตอบ:


50

ซับในตัวเล็ก ๆ นี้จะโผล่ขึ้นมาบางสิ่งบางอย่างหากระบบไฟล์ ro มีอยู่

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

สมมติว่าคุณมักจะไม่มีระบบไฟล์ ro เช่นซีดีในไดรฟ์มันก็เพียงพอสำหรับบางประเภทการตรวจสอบขั้นพื้นฐานและไม่ต้องการเปลี่ยนระบบไฟล์เพื่อค้นหาสถานะปัจจุบัน นอกจากนี้ยังไม่ถือว่าประเภทระบบไฟล์ของคุณ ไพพ์ลงใน grep -v iso9660 หากคุณต้องการไม่ให้บันทึกซีดีของคุณ


1
ฉันต้องใช้grep -P "\sro[\s,]" /proc/mountsหรือgrep " ro[ ,]" /proc/mounts
WhiteKnight

3
นี่เป็นคำตอบที่ดีกว่า "ลองและสร้างไฟล์" ขอบคุณ
Vagnerr

สิ่งนี้ไม่เพียงบอกตัวเลือกที่ใช้ในการเมาท์ไม่ใช่สถานะปัจจุบันใช่หรือไม่ เช่นรายการที่มีตัวเลือกได้ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0รับการตั้งค่าให้นับใหม่เป็นแบบอ่านอย่างเดียวในกรณีที่เกิดข้อผิดพลาดดังนั้นโดยไม่ตรวจสอบmountคุณไม่ทราบว่าการติดตั้งนั้นได้เกิดขึ้นแล้วroหรือไม่
Walf

นั่นไม่ใช่ประสบการณ์ของฉัน
flickerfly

3
ฉันเพิ่งมีวันนี้ นี่คือระบบไฟล์รูทใน ro แต่เป็น rw เมื่อเริ่มทำงาน $ grep "\sro[\s,]" /proc/mountsผลลัพธ์:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly

11

คำถามเก่า แต่ฉันเจอมาแล้วโดยมองหาความช่วยเหลือแบบเดียวกันและดูเหมือนว่าจะพบวิธีที่ง่ายยิ่งขึ้นโดยไม่ต้องสร้างไฟล์

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

แน่นอน root-ro ติดตั้ง fs และ root-rw คือ rw fs


3
ดูเหมือนว่าจะทดสอบการอนุญาตระบบไฟล์ แต่ไม่ใช่สถานะเมานต์
Robert Calhoun

1
จริง แต่มันง่ายมากและสามารถใช้งานได้ในบางกรณี (เช่นของฉัน)
Yajo

จากman dashสำหรับ-wตัวเลือก - 'ไฟล์ไม่สามารถเขียนได้ในระบบไฟล์แบบอ่านอย่างเดียวแม้ว่าการทดสอบนี้บ่งชี้ว่าเป็นจริง' AFAIK นี้จะเหมือนกันสำหรับกระสุนอื่น ๆ
แกรม

7

หากระบบไฟล์ติดตั้งอยู่ฉันจะซีดีไปยังไดเรกทอรีชั่วคราวและพยายามสร้างไฟล์ รหัสส่งคืนจะบอกคุณว่าระบบไฟล์เป็นแบบอ่านอย่างเดียวหรืออ่าน - เขียนโดยมีเงื่อนไขว่าระบบไฟล์ไม่เต็ม (ขอบคุณวิลเล็ม)


1
หากคุณเพียงแค่ตรวจสอบเพื่อดูว่า filesytem ถูกเมาท์การรับเอาท์พุทจากการเมาท์ก็เพียงพอแล้ว แต่ฉันต้องยอมรับนี่เป็นวิธีตรวจสอบที่ละเอียดยิ่งขึ้น มีบางโอกาสที่การเมาต์สามารถรายงานว่ามันถูกเมาท์แบบอ่าน / เขียน แต่จริงๆแล้วเป็นแบบอ่านอย่างเดียว ตัวอย่างทั่วไปของข้อผิดพลาดนี้เป็นจำนวนมากของข้อผิดพลาด SCSI บนอุปกรณ์ทำให้เกิดการป้องกันตัวเองโดยการอ่านอย่างเดียว การสร้างไฟล์จะยืนยันการอ่าน + เขียน / อ่านอย่างเดียวโดยไม่ต้องสงสัย
อเล็กซ์

1
นี้จะเป็นระเบียบ:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
เกล็นแจ็คแมน

สคริปต์ตามที่เขียนมีสภาพการแข่งขัน ฉันจะใช้ FILE = mktemp -p /filesystem/of/interest/แทนที่จะใช้ 'afile' เพื่อสร้างไฟล์และชื่อไฟล์ ดีที่สุด
Rik Schneider

1
สิ่งนี้จะรายงานระบบไฟล์แบบเต็มอย่างไม่ถูกต้องว่าเป็นแบบอ่านอย่างเดียว
วิลเล็ม

@ David ดูเหมือนว่าจะเป็นการแฮ็กที่หยุดชั่วคราวแทนวิธีการแก้ปัญหาที่แท้จริง
Pacerier

4

ฉันเพิ่งมีปัญหานี้และสิ่งเหล่านี้เป็นน้ำพริกจริง ...

ดูที่ / 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 - พาร์ติชั่นทั้งสองนี้แสดงว่ากำลังถูกเมานท์ rw เมื่อใช้คำสั่ง mount


2
สิ่งนี้จะไม่ทำงานหาก 'ro' เป็นตัวเลือกการเมานต์เดียว
Willem

3

ขึ้นอยู่กับคำตอบของการสั่นไหวที่ได้รับอิทธิพลจากความคิดเห็นจาก WhiteKnight

สร้างฟังก์ชั่นตรวจจับได้ทันที

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

ใช้มันเพื่อตรวจสอบว่าเส้นทางอยู่บน fs อ่านอย่างเดียว

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

และกำจัดเมื่อเสร็จแล้ว

#dump temp function
unset -f is_readonly;


0

ตัวอย่างเช่นเพื่อตรวจสอบว่าพาร์ติชันรากอยู่ในโหมดอ่านอย่างเดียวหรือไม่:

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

2
กรณีนี้ไม่สามารถตรวจจับได้ทั้งหมด / sbin / mount จะดูที่ / etc / mtab สำหรับเวอร์ชันที่แคชของระบบไฟล์ที่เมาท์อยู่ในปัจจุบัน (และตัวเลือกปัจจุบัน) หาก / จัดการเพื่อติดตั้ง ro ใหม่ด้วยเหตุผลบางอย่าง mtab อาจไม่ได้รับการอัปเดตอย่างถูกต้องดังนั้น / อาจปรากฏว่า rw ยังคงอยู่ / proc / mounts ควรแสดงค่าที่ถูกต้องเสมอ
Travis Campbell

1
ฉันเห็นด้วยกับความต้องการใช้ / proc / mounts ฉันคิดว่าการทดสอบนี้ควรจะลดลงเป็นเชลล์ (ทุบตีตั้งแต่ OP ขอให้) ฟังก์ชั่นที่ทำให้แน่ใจว่าสตริงที่ถูกอ้างอิงไม่ใช่ซับสตริงของพา ธ อื่น
Skaperen

0

เช่นเดียวกับ Antonio คุณสามารถใช้ / proc / mounts เพื่อทำสิ่งเดียวกัน ใช้ไดรฟ์ของคุณเองแทน sda4

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.