ซ่อนไฟล์ใน Linux โดยไม่ใช้จุด


32

ฉันต้องการซ่อนไฟล์ใน Linux โดยไม่ใช้จุดเพราะเป็นไปได้ใน Windows

มีวิธีทำเช่นนี้หรือไม่?


6
โปรดทราบว่าการซ่อนไฟล์ (การทำให้งงงวย) ไม่ใช่การแทนที่เพื่อความปลอดภัย (จำกัด การเข้าถึง)
uSlackr

คำตอบ:


26

คุณไม่สามารถ. มีความแตกต่างพื้นฐานในวิธีที่ระบบไฟล์จัดการการตั้งค่าที่ซ่อนอยู่ ใน Windows ระบบไฟล์จะจัดเก็บแอตทริบิวต์หลายอย่างสำหรับไฟล์ในเมทาดาทารวมถึงแอตทริบิวต์ "hidden" และ "system" (ซึ่งทั้งคู่เป็นไฟล์ที่ซ่อนอยู่) โดยทั่วไประบบไฟล์ * nix จะไม่มีการจัดเก็บแอตทริบิวต์ดังกล่าว แต่ข้อมูลจะต้องอยู่ที่อื่นเช่นในชื่อไฟล์ การประชุมจึงเป็นไฟล์ที่เริ่มต้นด้วย (และขึ้นอยู่กับระบบของคุณบางทีคนอื่นเช่น _) จะไม่แสดงโดยเครื่องมือส่วนใหญ่ตามค่าเริ่มต้น

นี่คือเพื่อความสะดวกสบายหมดจด การเริ่มต้นชื่อไฟล์นั้นไม่มีความหมาย แต่อย่างใด แต่ "ผู้ใช้อาจไม่ต้องการเห็นสิ่งนี้ตลอดเวลา" เพื่อให้แน่ใจว่าคุณรู้ว่าทำงานเช่นls -aจะแสดงไฟล์ทั้งหมด

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

สิทธิ์ Unix ที่เกี่ยวข้องกับไดเรกทอรีมักทำให้ผู้คนสับสนและอาจเข้าใจได้ดีขึ้นว่าจะช่วยคุณได้ สิทธิ์ "อ่าน" และ "ดำเนินการ" ( rและx) หมายถึงสิ่งที่แตกต่างสำหรับไดเรกทอรีมากกว่าที่ทำกับไฟล์ สำหรับไดเรกทอรีxสิทธิ์ดำเนินการจะกำหนดว่าคุณเข้าถึง inodes ในไดเรกทอรีหรือไม่ rสิทธิ์การอ่านกำหนดว่าคุณสามารถเข้าถึงรายชื่อของไดเรกทอรีได้หรือไม่ ตามหน้าที่xอนุญาตให้ผู้ใช้ทำสิ่งต่างๆในไดเรกทอรีขณะที่rสิทธิ์อนุญาตให้พวกเขาเห็นสิ่งที่อยู่ในนั้น สิ่งเหล่านี้แตกต่างกันและความแตกต่างอาจสร้างความสับสน ลองดูตัวอย่าง:


jeanluc@login64: ~ $ mkdir example
jeanluc@login64: ~ $ echo "you can read it" > example/file
jeanluc@login64: ~ $ ls example/
file
jeanluc@login64: ~ $ cat example/file
you can read it

jeanluc@login64: ~ $ chmod -x example/
jeanluc@login64: ~ $ ls example/
ls: cannot access example/file: Permission denied
file
jeanluc@login64: ~ $ cat example/file
cat: example/file: Permission denied
jeanluc@login64: ~ $ cd example/
-bash: cd: example/: Permission denied

jeanluc@login64: ~ $ chmod +x example/
jeanluc@login64: ~ $ chmod -r example/
jeanluc@login64: ~ $ ls example/
ls: cannot open directory example/: Permission denied
jeanluc@login64: ~ $ cat example/file
you can read it
jeanluc@login64: ~ $ cd example/
jeanluc@login64: ~/example $ ls
ls: cannot open directory .: Permission denied
jeanluc@login64: ~/example $ cd ..

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

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

สิ่งนี้อาจไม่เกี่ยวข้องกับคำถามของคุณฉันแค่ต้องการให้แน่ใจว่าคุณเข้าใจการอนุญาตของไดเรกทอรี


26

สร้างไฟล์.hiddenในไดเรกทอรีที่มีชื่อไฟล์ที่จะซ่อน (หนึ่งชื่อในแต่ละบรรทัด)

จากนั้นเพิ่มสิ่งต่อไปนี้ใน~/.bashrc:

ls () {
  if [ -f .hidden ]; then
    declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
    ls "$@"
  fi
}

ตอนนี้lsคำสั่งของคุณจะไม่แสดงไฟล์เหล่านี้

ฉันใช้เทคนิคนี้เพื่อซ่อน__pycache__และ__init__.pyไฟล์ของฉัน


แก้ไข: ตามความคิดเห็นอื่นนี้ยังซ่อนไว้ในอย่างน้อยหนึ่ง (Nautilus) แต่อาจเบราว์เซอร์ไฟล์ GUI หลายคนเช่นกัน


มันน่าสนใจ. มันใช้งานได้ในหอยโข่งหรือเครื่องมือกุยอื่น ๆ ? คุณสามารถดูไฟล์ด้วยได้ls -alหรือไม่?
Jakuje

1
รหัสหายไป '' ในตอนท้าย (และในกรณีที่คุณสงสัยว่า upvotes มาจาก: askubuntu.com/a/713591/15811 ) ;-)
Rinzwind

14

คุณสามารถซ่อนไฟล์ใน Linux ได้โดยไม่ต้องเพิ่มจุด จริงๆแล้วมันซ่อนไว้ใน Nautilus; lsจากบรรทัดคำสั่งยังจะแสดงรายชื่อไฟล์

  1. สร้างไฟล์ข้อความชื่อ.hiddenในโฟลเดอร์ที่คุณต้องการซ่อนไฟล์
  2. เพิ่มชื่อของไฟล์หรือโฟลเดอร์ที่คุณต้องการซ่อนหนึ่งไฟล์ต่อหนึ่งบรรทัดไปยังไฟล์
  3. รีเฟรชไฟล์เบราว์เซอร์ของคุณ

2
ไม่ทำงานที่นี่กับ "ls" ใน debian 5.0 มันเฉพาะกับหอยโข่งหรือปลาโลมาหรือ ... ?
Tim Haegele

2
ไฟล์ถูกซ่อนอยู่ใน Nautilus; ไม่อยู่ในlsรายการ
ถึง

1
ทางออกที่ยอดเยี่ยม! :)
Merianos Nikos

4

จุดใช้เพื่อซ่อนไฟล์ใน linux และไม่สามารถเปลี่ยนได้

อย่างไรก็ตามคุณสามารถเล่นด้วยการอนุญาตไฟล์เพื่อป้องกันไม่ให้ผู้ใช้สามารถเข้าถึงโฟลเดอร์ / ไฟล์ที่กำหนดได้ ลองทดสอบด้วยchmodคำสั่ง


2

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

ผมเชื่อว่าไฟล์เท่านั้นเพิ่มเติมซ่อนไว้โดยใด ๆ จัดการไฟล์ลินุกซ์ได้รับการสำรองไฟล์คือผู้ที่ลงท้ายด้วยตัวหนอน~หรือ.bakหรือสิ่งที่พวกเขาเชื่อว่าเป็นส่วนขยายของการสำรองข้อมูล ไม่ว่าในกรณีใดคุณอาจโชคดีถ้าทั้งหมดที่คุณต้องการทำคือซ่อนไฟล์สำรองจากตัวจัดการไฟล์

อย่าให้นามสกุลไฟล์สำรองของคุณเพื่อซ่อนพวกเขามิเช่นนั้นอาจถูกลบโดยไม่ตั้งใจ !!

นอกจากนี้คุณสามารถซ่อนไฟล์จาก Finder ใน Mac OS X โดยใช้คำสั่งSetFile -a V [file]หรือแก้ไข/.hiddenแต่แน่นอนว่านี่จะไม่ซ่อนไฟล์จากlsโปรแกรมของบรรทัดคำสั่ง


3
ใน OS X chflags hidden filenameคุณยังสามารถซ่อนไฟล์โดย
slhck

2

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

ฉันจะพิจารณาเครื่องมือบรรทัดคำสั่งเท่านั้นเนื่องจากค่อนข้างสม่ำเสมอและเป็นเครื่องมือเดียวที่ใช้อย่างต่อเนื่องเป็นตัวฉัน

มีหลายวิธีในการจัดเก็บข้อมูลนี้:

  1. คุณสามารถเก็บแอตทริบิวต์แบบขยาย "ซ่อน" ในไฟล์ที่เลือก ดูman attr

      attr -s hidden -V true your_file
    
  2. หรือตามที่กล่าวไว้ข้างต้นคุณสามารถจัดเก็บรายชื่อไฟล์ใน.hiddenไฟล์

สิ่งสำคัญ: สิ่งนี้จะไม่ทำงานนอกกรอบที่คุณต้องใช้ตรรกะระบบที่สะอาดจะไม่สนใจ.hiddenไฟล์และhiddenคุณสมบัติเพิ่มเติม!

นอกจากนี้ยังมีการนำ muliple ที่เป็นไปได้:

  1. หากคุณมีไฟล์เพียงไม่กี่ไฟล์ให้เขียน.bashrcไฟล์ของคุณ

    alias ls='ls -I filename_1 -I filename_2'
    

    man ls สำหรับข้อมูลเพิ่มเติม.

  2. เขียนfunction lsเช่นที่จะจัดการกับตรรกะทั้งหมดที่อยู่เบื้องหลังการรับรู้ไฟล์ที่ซ่อนอยู่และการประกอบรายการของ-Iรายการทั้งหมดแล้วดำเนินการ /bin/lsกับการละเว้นธงที่เหมาะสม งานลำบากมากเพราะคุณต้องจัดการlsพารามิเตอร์ทั้งหมดอย่างถูกต้อง

  3. รับแหล่งที่มาของ coreutils

    git clone git://git.sv.gnu.org/coreutils
    

    หรือ

    git clone git://git.suckless.org/sbase
    

    แก้ไขตามที่คุณต้องการในการจัดการการนำไฟล์ที่ซ่อนไปใช้ และวางไว้ในของคุณPATH

    ฉันแฮ็คมันในเวลาน้อยกว่า 5 นาทีโดยใช้แหล่งที่มา suckless และ diff เป็นเช่นนี้:

     diff --git a/ls.c b/ls.c
     index cdfce4d..8197409 100644
     --- a/ls.c
     +++ b/ls.c
     @@ -214,6 +214,17 @@ lsdir(const char *path)
             first = 0;
             while ((d = readdir(dp))) {
     +///////////////////////////////////////////////
     +// Dirty hack to implement hidden files
     +// FIXME: Make proper(!) subroutine
     +               char attr_command[1024] = "attr -Lqg hidden "; // Oh, dear. That's bad
     +               int attr_code;
     +               strcat(attr_command, d->d_name);
     +               strcat(attr_command, " >/dev/null 2>&1");
     +               attr_code = system(attr_command);
     +               if (!attr_code)
     +                       continue;
     +///////////////////////////////////////////////
                     if (d->d_name[0] == '.' && !aflag && !Aflag)
                             continue;
                     else if (Aflag)
    

ls.cโกหกในsrcไม่ไดเรกทอรีรากและไม่มีฟังก์ชั่นในlsdir ls.c
Melab

2

นี่เป็นทางออกที่ดีที่สุดที่ฉันพบเพิ่มในโปรไฟล์ของคุณ:

alias ls="/bin/ls --color=auto --ignore='*.egg-info' --ignore='__pycache__'"

หากคุณต้องการรูปแบบเพิ่มเติมเพียงเพิ่ม--ignoreธงเพิ่มเติม


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

2

ทุกวันนี้คุณสามารถเขียนFUSEที่ซ่อนไฟล์ตามการกำหนดค่าที่กำหนด

บทความนี้ทำให้ฉันเชื่อว่าคุณต้องปรับแต่งgetdirฟังก์ชั่น:

getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
สิ่งนี้จะอ่านเนื้อหาของไดเรกทอรี การดำเนินการนี้เป็นopendir(), readdir(), ... , closedir()ลำดับในหนึ่งสาย สำหรับแต่ละรายการไดเร็กทอรีfilldir()ควรเรียกใช้ฟังก์ชัน

ฉันไม่ใช่โปรแกรมเมอร์ แต่ฉันคิดว่าจะทำให้getdirไฟล์ทั้งหมดที่อยู่ในรายการ (เช่น) .hiddenถูกลบออก หากคุณใช้งานอย่างถูกต้องเครื่องมือทุกตัว (GUI หรือไม่) จะได้รับผลกระทบ


1

คุณสามารถ 'ซ่อน' เนื้อหาของไดเรกทอรีโดยการออกไป 'x' perms สำหรับกลุ่มหรืออื่น ๆchmod go-x directoryname: คุณไม่สามารถแสดงรายการไฟล์ได้อีกต่อไปแม้ว่าคุณจะสามารถเข้าถึงไฟล์ได้หากคุณรู้เส้นทางที่แน่นอน นี่ไม่เหมือนสิ่งที่คุณต้องการ

โปรดจำไว้ว่าสิ่ง dotfile คือความสะดวกสบายไม่ใช่การซ่อนไฟล์เพื่อความปลอดภัย แต่เพื่อลดความยุ่งเหยิงสำหรับไฟล์ระหว่างการแสดงรายการไฟล์ มันถูกอบเข้าlsกับเครื่องมืออื่น ๆ


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