ฉันจะตรวจสอบว่ามีการติดตั้งไดรฟ์ข้อมูลที่ควรใช้ Python หรือไม่


10

ฉันมีสคริปต์สำรองที่เขียนใน Python ซึ่งสร้างไดเรกทอรีปลายทางก่อนที่จะคัดลอกไดเรกทอรีแหล่งที่มา ฉันกำหนดค่าให้ใช้/external-backupเป็นปลายทางซึ่งเป็นที่ที่ฉันติดตั้งฮาร์ดไดรฟ์ภายนอก ฉันเพิ่งเรียกใช้สคริปต์โดยไม่ต้องเปิดฮาร์ดไดรฟ์ (หรือติดตั้ง) และพบว่ามันทำงานได้ตามปกติแม้ว่าจะสำรองข้อมูลไว้ในฮาร์ดไดรฟ์ภายในซึ่งไม่มีพื้นที่เพียงพอที่จะสำรองข้อมูล

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

คำถามโบนัสคือเหตุผลว่าทำไมสิ่งนี้ถึงได้รับอนุญาตเมื่อระบบปฏิบัติการรู้ว่าไดเรกทอรีควรจะอยู่บนอุปกรณ์อื่นและสิ่งที่จะเกิดขึ้นกับข้อมูล (บนฮาร์ดไดรฟ์ภายใน) ฉันควรติดตั้งอุปกรณ์นั้นในภายหลัง (ฮาร์ดไดรฟ์ภายนอก) หรือไม่ เห็นได้ชัดว่าไม่มีสำเนาสองชุดในอุปกรณ์ที่แตกต่างกันในเส้นทางเดียวกัน!

ขอบคุณล่วงหน้า!

คำตอบ:


23

os.path.ismount()ฉันจะใช้เวลาดูที่


1
ปัญหาเดียวคือมันส่งคืนบูลีน & ไม่ได้ระบุว่ามีอุปกรณ์ที่เหมาะสมหรือไม่
McJeff

3
@McJeff: ที่จริงมันไม่ได้บอกที่มันบอกถ้า หากไม่มีอุปกรณ์อยู่ที่นั่นอุปกรณ์นั้นจะส่งคืนค่าเท็จและการเขียนไปยังเส้นทางนั้นจะเขียนไปยังไดเรกทอรีพื้นฐานในระบบไฟล์หลัก ดังนั้นถ้ามันกลับเท็จให้ออกข้อผิดพลาดและไม่ได้เขียน ไดเรกทอรี/external-backupไม่ได้อยู่บนอุปกรณ์ภายนอก แต่จะอยู่ในระบบไฟล์หลัก ระบบรู้เพียงสิ่งที่mountบอกเท่านั้นมันไม่มีความคิดว่าควรจะมีอะไร ไม่มีอะไรพิเศษเกี่ยวกับ "จุดเชื่อมต่อ" ในระบบไฟล์ Unix มันเป็นเพียงไดเรกทอรีปกติ
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

มันทำงานได้อย่างสมบูรณ์แบบ ฉันจะไม่ป้องกันปริมาณอื่น ๆ ที่ติดตั้งอยู่ที่นั่นเพียงเพราะมันไม่ใช่ระบบไฟล์หลัก ขออภัยที่ผู้ตอบคนอื่น ๆ คำตอบของคุณอาจตอบคำถามของฉันได้มากกว่านี้ แต่ฉันเกรงว่าฉันไม่รู้ว่าจะถามอะไรตั้งแต่แรกเพราะคุณอาจบอกได้;) ฉันให้คะแนนคุณหมดแล้ว .
เบ็นไฮ

คำอธิบายที่ดี!
McJeff

5

สำหรับคำตอบที่ชัดเจนสำหรับสิ่งที่เคอร์เนลรู้เท่านั้นให้สอบถามเคอร์เนล:

cat /proc/mounts

ไฟล์นั้นสามารถอ่าน / วิเคราะห์คำได้ราวกับว่ามันเป็นไฟล์ปกติโดยใช้เครื่องมือที่คุณชอบ รวมถึง Python ตัวอย่าง Quick-n-dirty:

#!/usr/bin/python

d = {}

for l in file('/proc/mounts'):
    if l[0] == '/':
        l = l.split()
        d[l[0]] = l[1]

import pprint

pprint.pprint(d)

4

วิธีที่ง่ายที่สุดในการตรวจสอบคือการเรียกใช้mountผ่านsubprocessและดูว่ามันปรากฏขึ้นที่นั่นหรือไม่ สำหรับเครดิตพิเศษใช้os.readlink()กับเนื้อหาของ/dev/disk/by-*เพื่อหาว่าเป็นอุปกรณ์ใด


อย่างที่ฉันเห็นมันปัญหาเกี่ยวกับวิธีการนั้นคือผลลัพธ์ที่ได้mountถูกกำหนดไว้อย่างเลอะเทอะอย่างดีที่สุด mountเอาท์พุทอะไรถ้าฉันได้ติดตั้ง/dev/evil device on tourที่/directory on which I mount devices? วจีวิภาคของการส่งออกอาจจะไม่น่าเชื่อถือในกรณีดังกล่าว ...
Skyking

2

คำตอบโบนัส /external-backupหากอุปกรณ์ภายนอกไม่ได้ติดตั้งข้อมูลที่ถูกเขียนไปยังพาร์ทิชันรากที่เส้นทาง หากอุปกรณ์ภายนอกถูกเมาท์ข้อมูลบนรูทพาร์ติชันยังคงอยู่ที่นั่น แต่ไม่สามารถเข้าถึงได้เพราะ/external-backupตอนนี้ชี้ไปที่อุปกรณ์ภายนอก


2

คำถามเก่า แต่ฉันคิดว่าฉันมีส่วนร่วมแก้ปัญหาของฉัน (ตามคำตอบของ Dennis WilliamsonและIgnacio Vazquez-Abrams ) ต่อไป เนื่องจากฉันใช้มันในสภาพแวดล้อมที่ไม่ใช่ Linux เพื่อตรวจสอบไดเรกทอรีระยะไกลที่ถูกเมานต์/ procและmtabไม่สามารถใช้งานได้และไม่มีการตรวจสอบเพิ่มเติมที่ถูกนำไปใช้:

def is_mounted(special, directory):
    search_prefix = '{} on {}'.format(special, directory.rstrip('/'))

    if os.path.ismount(directory):
        mounts = subprocess.check_output(['mount']).split('\n')

        for line in mounts:
            if line[:len(search_prefix)] == search_prefix:
                return True;

    return False

ยินดีต้อนรับการปรับปรุง!


1

ไฟล์ / etc / mtab มีอยู่เพื่อแจ้งให้คุณทราบถึงสิ่งที่ติดตั้งอยู่ในปัจจุบัน มีการgetmntentโทร แต่ฉันไม่คิดว่ามันจะถูกส่งออกในosโมดูล รวดเร็วและสกปรก? เปิด / etc / mtab และแยก ตรวจสอบให้แน่ใจว่าอุปกรณ์ของคุณมีอยู่ในคอลัมน์ 0 และจุดเชื่อมต่อปลายทางในคอลัมน์ 1 ถูกต้อง

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