บน OS X ทำไม `sudo ls` แสดงไฟล์ที่ซ่อนอยู่ (จุด)


162

ด้วย OS X Yosemite โดยใช้คำสั่งต่อไปนี้ฉันได้รับสิ่งต่อไปนี้:

$ touch .a
$ touch b
$ /bin/ls
b
$ /bin/ls -A
.a  b
$ sudo /bin/ls
.a  b

มันแสดงไฟล์ที่ซ่อนอยู่ (ที่มีชื่อขึ้นต้นด้วยจุด) เมื่อเรียกใช้โดย root และไม่แสดงพวกเขา (ตามที่คาดไว้) เมื่อทำงานในฐานะผู้ใช้ปกติ สิ่งนี้แตกต่างจากสิ่งที่lsอยู่บน Linux (สิ่งที่มาจากcoreutils) ทำ

ทำไมทำlsเช่นนี้?


141
ฉันอ่านผิดแท็กเหล่านั้นเนื่องจาก "OSX ไม่ดี" และสับสนจริงๆ
Raystafarian

5
มันจะสับสนน้อยกว่าหากแท็กได้รับอนุญาตในตัวพิมพ์ใหญ่BSDและOSXเหมาะสมกว่าที่นี่
ryenus

@Raystafarian ค่อนข้างตลกเพราะโดยปกติแล้วเป็นวิธีอื่น ๆ คนพยายามเขียนประโยคด้วยแท็ก
Braiam

คำตอบ:


404

ปรากฎว่าคุณสมบัตินี้ไม่ได้เฉพาะแอปเปิ้ล นี่คือคุณสมบัติของระบบ BSD โดยทั่วไป

/* Root is -A automatically. */
if (!getuid())
    f_listdot = 1;

ตอนแรกผมก็สามารถที่จะติดตามกลับไปยังแหล่งที่มาของ4.4BSD-Lite มันมีอยู่แล้วในFreeBSD นี้จากปี 1994 ซึ่งนำเข้าแหล่งข้อมูลเหล่านั้น

คุณลักษณะนี้ยังอยู่ใน OpenBSD และสามารถพบได้ในนี้กระทำจาก 1995 ที่อ้างว่านำเข้าจากรหัส NetBSD ดังนั้นนี้มีอยู่แล้วในปัจจุบันNetBSD

จากนั้นหนึ่งค้นพบกระทำของ NetBSD จาก 1993 ที่อ้างว่านำเข้าจากรหัส386BSDและคุณลักษณะที่มีอยู่แล้วมี นอกจากนี้การกระทำนี้แสดงให้เห็นว่ามันอยู่ที่นั่นในระหว่างการพัฒนา 386BSD เวอร์ชัน 0.0 ในปี 1991 ซึ่งแยกจาก BSD ประมาณ 4.3 เท่าที่ฉันสามารถบอกได้

ความคิดเห็นที่ปรากฏขึ้นเป็นครั้งแรกในระหว่างการพัฒนา4.3BSD-Renoในการกระทำนี้ (27 มิ.ย. 2532) เรื่อง“ ls รุ่นใหม่ที่ทำงานครั้งแรก” ความคิดเห็นเดิมกล่าวว่า:

/* root sees all files automatically */

ซึ่งเปลี่ยนไปในวันนั้น (ฉันไม่แน่ใจว่าการประทับเวลาถูกต้องทั้งหมดในที่เก็บนี้) ถึง:

/* root is -A automatically */

และเฉพาะในปี 1992 ตัวพิมพ์ใหญ่และระยะเวลาถูกเพิ่มเข้ามาเปลี่ยนความคิดเห็นเป็นสิ่งที่เรามีตอนนี้:

/* Root is -A automatically. */

แต่พฤติกรรมดังกล่าวมีอยู่ใน 2BSD ณ วันที่ 9 พฤษภาคม 2522 ตามที่เห็นในภาพรวมนี้ :

Aflg = getuid() == 0;

ฉันไม่สามารถหาประวัติจริงใด ๆ จากเวลาเหล่านั้น แต่ยังมีภาพรวม 1BSD นี้จากปี 1977 โดยไม่มีบรรทัดเหล่านั้น และไม่มี-Aธงจริง

ดังนั้นดูเหมือนว่าฟีเจอร์นี้จะเปิดตัวในช่วงเดือนพฤศจิกายนปี 1977 (กำลังพัฒนา 1BSD ในขณะนั้น) และการเปิดตัว 2BSD ในเดือนพฤษภาคม 2522


สิ่งที่ฉันพบในระหว่างการตรวจสอบนี้คือการ-Iตั้งค่าสถานะที่เพิ่มใน FreeBSD ในปี 2005 เพื่อลบล้างพฤติกรรมนี้และได้รับการทำใหม่ในภายหลัง


52
นอกจากนี้ก็อาจจะมีมูลค่าสังเกตว่า "คุณสมบัติ" ของการซ่อนไฟล์โดยเริ่มต้นพวกเขาด้วย.เป็นข้อผิดพลาดง่าย - lsควรเท่านั้นที่จะซ่อนไดเรกทอรีทุกอย่างไม่ได้เริ่มต้นด้วย. .กรอไปข้างหน้าอย่างรวดเร็วไม่กี่ทศวรรษและมักใช้เพื่อซ่อนไฟล์อันตราย ฯลฯ ในขณะที่ใช้เพื่อซ่อนการกำหนดค่าระบบ ฯลฯ ดังนั้นผู้ดูแลระบบจึงสามารถดูไฟล์เหล่านั้นได้ .
Luaan

23
การอ้างอิงสำหรับความคิดเห็นของ Luaan: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (ซึ่ง Rob Pike อธิบายว่าการซ่อน "ไฟล์ dot" เริ่มเป็นจุดบกพร่อง)
nibot

2
จากเหตุผล POSIX "การใช้งานในอดีตของยูทิลิตี้ ls แสดงรายการทั้งหมดในไดเรกทอรียกเว้น dot และ dot-dot เมื่อ superuser เรียกใช้ ls โดยไม่ระบุตัวเลือก -a เมื่อผู้ใช้" ปกติ "เรียกใช้ ls โดยไม่ระบุ -a พวกเขา ไม่ควรเห็นข้อมูลเกี่ยวกับไฟล์ใด ๆ ที่มีชื่อขึ้นต้นด้วย <period> เว้นแต่ว่าพวกมันถูกตั้งชื่อว่าเป็นตัวถูกดำเนินการไฟล์ " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..

มันไกลมาก ฉันคิดว่ามันมาก่อนการแบ่ง SysV-BSD เป็นครั้งสุดท้ายที่ฉันเข้าถึงระบบ SysV พฤติกรรมเดียวกันที่แน่นอนปรากฏขึ้น
Joshua

3
คำตอบมหากาพย์ เรียนรู้ประวัติศาสตร์!
Corey Goldberg

15

นี่คือลิงค์ไปยังซอร์สโค้ด /* Root is -A automatically. */หมายเหตุ นี้เป็นคุณลักษณะในรุ่นแอปเปิ้ลของ lsBSD


ค้นหาที่น่าสนใจ มีวิธีการปราบปรามไฟล์ที่ซ่อนอยู่เมื่อทำ ls หรือไม่?
นาย Lister

5
หืมดูเหมือนว่านี่ไม่ใช่ฟีเจอร์เฉพาะของ Apple แต่มันมาจากโลก BSD?
kirelagin

2
ใช่มันไม่ได้เฉพาะของ Apple ขอบคุณสำหรับคำตอบของคุณมันทำให้ฉันไปถูกทาง ฉันใช้Root is -A automaticallyสตริงเพื่อค้นหาเบาะแส
kirelagin

Mr Lister: คุณสามารถระงับการแสดงผลของไฟล์ dot เป็นรูทด้วย -I (capital i) บนระบบปฏิบัติการหลายระบบ (FreeBSD ดังนั้นอาจ OS X ด้วย)
Allan Jude

1

IIRC มีหัวข้อเกี่ยวกับเรื่องนี้ย้อนกลับไปในยุคแรก ๆ ของ Usenet (ช่วงต้นยุค 80) มีการเพิ่มคุณสมบัตินี้เพื่อเป็นการป้องกันความปลอดภัยเพื่อให้ผู้ใช้ที่เป็นอันตรายไม่สามารถซ่อนไฟล์ / ไดเรกทอรี / ไฟล์ที่เรียกใช้งานได้จาก sysadmin / root ทฤษฏีนั้นโดยพื้นฐานแล้ว "รากมีการเข้าถึงทุกสิ่งดังนั้นมันควรจะเห็นทุกอย่าง"


ฟังดูสมเหตุสมผล (แม้ว่าการเปลี่ยนไฟล์เป็น dot-file เป็นวิธีที่น่าสงสัยในการ "ซ่อน") คงจะดีถ้าได้พบคลังข้อมูลเหล่านั้น
kirelagin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.