เหตุใดฉันไม่สามารถแสดงรายการไดเรกทอรีที่มีสิทธิ์อ่านได้


14

ฉันสร้างไดเรกทอรีdและไฟล์fข้างใน จากนั้นฉันให้สิทธิ์การอ่านในไดเรกทอรีนั้นเท่านั้น ฉันเข้าใจว่าควรหมายความว่าฉันสามารถแสดงรายการไฟล์ (เช่นที่นี่ ) แต่ฉันทำไม่ได้

will@wrmpb /p/t/permissions> ls -al
total 0
drwxr-xr-x   3 will  wheel  102  4 Oct 08:30 .
drwxrwxrwt  16 root  wheel  544  4 Oct 08:30 ..
dr--------   3 will  wheel  102  4 Oct 08:42 d
will@wrmpb /p/t/permissions> ls d
will@wrmpb /p/t/permissions>

หากฉันเปลี่ยนการอนุญาตให้เขียนและดำเนินการฉันสามารถดูไฟล์ได้

will@wrmpb /p/t/permissions> chmod 500 d
will@wrmpb /p/t/permissions> ls d
f
will@wrmpb /p/t/permissions> 

ทำไมนี้ ฉันใช้ MacOS

แก้ไข: โดยอ้างอิงจากคำตอบของ @ ccorn มีความเกี่ยวข้องที่ฉันใช้ปลาและtype lsให้สิ่งต่อไปนี้:

will@wrmpb /p/t/permissions> type ls
ls is a function with definition
function ls --description 'List contents of directory'
    command ls -G $argv
end

สำเนาไม่ตอบคำถาม หมายความว่าคุณสามารถทำสิ่งที่ฉันแสดงให้เห็นว่าคุณทำไม่ได้ คำตอบของ @ ccorn นั้นสมบูรณ์แบบ
wrgrs

ว้าวสิ่งที่ปลาเป็นข้อมูลที่ขาดหายไป (ตอนแรก) ค่อนข้างสำคัญ
Stephen Kitt

ใช่คุณถูกต้องฉันควรจะเพิ่ม แต่ดูเหมือนว่าสิ่งเดียวกันจะเกิดขึ้นในทุบตีถ้าคุณalias ls='ls -G'ซึ่งฉันคิดว่าหลายคนทำ
wrgrs

ทำเพื่อฉัน คุณใช้ MacOS หรือเปล่า อาจมีคำถามอื่นที่นี่ แก้ไข: ใช่ฉันได้รับพฤติกรรมที่แตกต่างบน Linux
wrgrs

คำตอบ:


8

การเตรียมการบางอย่างเพื่อให้แน่ใจlsว่าไม่ได้ลองอะไรมากกว่าที่ควรจะเป็น:

$ unalias ls 2>/dev/null
$ unset -f ls
$ unset CLICOLOR

การสาธิตการrอนุญาตไดเรกทอรี:

$ ls -ld d
dr--------  3 ccorn  ccorn  102  4 Okt 14:35 d
$ ls d
f
$ ls -l d
ls: f: Permission denied
$ ls -F d
ls: f: Permission denied

ในระบบไฟล์ Unix แบบดั้งเดิมไดเรกทอรีเป็นเพียงรายการของคู่ (ชื่อหมายเลข inode) หมายเลข inode เป็นจำนวนเต็มที่ใช้เป็นดัชนีลงในตาราง inode ของระบบไฟล์ซึ่งจัดเก็บข้อมูลเมตาของไฟล์ที่เหลือ

การrอนุญาตในไดเร็กทอรีอนุญาตให้แสดงรายการชื่อในนั้น แต่ไม่สามารถเข้าถึงข้อมูลที่เก็บไว้ในตาราง inode นั่นคือการรับประเภทไฟล์ความยาวไฟล์สิทธิ์การใช้ไฟล์ ฯลฯ หรือการเปิดไฟล์ เพื่อที่คุณจะต้องxได้รับอนุญาตในไดเรกทอรี

นี่คือเหตุผลที่ls -l, ls -F, lsกับการส่งออกรหัสสี ฯลฯ ล้มเหลวโดยไม่ต้องxได้รับอนุญาตในขณะที่เพียงlsประสบความสำเร็จ

การxอนุญาตเพียงอย่างเดียวอนุญาตให้เข้าถึง inode นั่นคือให้ชื่อที่ชัดเจนในไดเรกทอรีนั้นxอนุญาตให้ค้นหา inode และเข้าถึงข้อมูลเมตาของรายการไดเรกทอรีนั้น:

$ chmod 100 d
$ ls -l d/f
-rw-r--r--  1 ccorn  ccorn  0  4 Okt 14:35 d/f
$ ls d
ls: d: Permission denied

ดังนั้นเพื่อเปิดไฟล์/a/b/c/fหรือรายการข้อมูลเมตาของไดเรกทอรี/, /a, /a/bและ/a/b/cต้องได้รับอนุญาตxได้รับอนุญาต

ไม่น่าแปลกใจที่การสร้างรายการไดเรกทอรีต้องการทั้งสิทธิ์wและการxอนุญาต:

$ chmod 100 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 200 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 300 d
$ touch d/g
$

วิกิพีเดียมีภาพรวมคร่าวๆในบทความเกี่ยวกับสิทธิ์ของระบบไฟล์


น่าอัศจรรย์ /bin/ls dแสดงเนื้อหาสำหรับฉัน ขอบคุณ!
wrgrs

ตกลงดังนั้นจึงเป็นปัญหาการกำหนดนิยามใหม่ ( -Gสำหรับเอาต์พุต colorized ซึ่งต้องการข้อมูลเมตาดังนั้นxperms) ดังนั้นการเตรียมการของฉันด้วยและunalias ls unset CLICOLORฉันควรจะเพิ่มunset -f lsเพื่อลบนิยามฟังก์ชั่นใด ๆ เช่นกัน แก้ไข
ccorn

wiki ressources เพิ่มเติม: wiki.archlinux.org/index.php/File_permissions_and_attributes
loxaxs

4

หากต้องการอ่านไดเรกทอรีคุณจะต้องสามารถเข้าไปยังไดเรกทอรีนั้นได้ด้วย (x บิต) ดังนั้นอย่างน้อยคุณต้องมี rx เพื่อให้ไดเรกทอรีสามารถเข้าถึงได้ในทุก ๆ ทาง


2
ไม่คุณทำไม่ได้; lsควรจะสามารถแสดงรายการไฟล์ในไดเรกทอรีได้แม้ว่าไดเรกทอรีนั้นจะไม่สามารถเรียกใช้งานได้
Stephen Kitt

คุณสามารถปล่อยให้สิทธิ์การอ่านปิด จากนั้นคุณจะสามารถเข้าถึงไฟล์ได้ แต่จะไม่แสดงรายการเนื้อหาของไดเรกทอรี
Kusalananda

@ Kusalananda - จุดดีแน่นอนฉันใช้มันเป็นครั้งคราว
Soruk

@Stephen Kitt - บางทีมันควร แต่การใช้งานก็คือว่ามันไม่ได้
Soruk

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