Ẩn các tệp trong Linux mà không sử dụng dấu chấm


32

Tôi muốn ẩn các tệp trong Linux mà không sử dụng dấu chấm, vì nó có thể có trong Windows.

Có cách nào để làm việc này không?


6
Hãy nhớ rằng các tệp ẩn (obfuscation) không thay thế cho bảo mật (hạn chế quyền truy cập)
uSlackr

Câu trả lời:


26

Bạn không thể. Có một sự khác biệt cơ bản trong cách các hệ thống tập tin xử lý các cài đặt ẩn. Trong Windows, hệ thống tệp lưu trữ một số thuộc tính cho tệp trong siêu dữ liệu, bao gồm các thuộc tính "ẩn" và "hệ thống" (cả hai đều là loại tệp ẩn). Trong các hệ thống tệp * nix chung, không có thuộc tính nào được lưu trữ. Thay vào đó, thông tin phải được đặt ở một nơi khác, chẳng hạn như trong tên tệp. Do đó, quy ước là các tập tin bắt đầu bằng. (và tùy thuộc vào hệ thống của bạn, có thể một số công cụ khác như _) sẽ không được hiển thị bởi hầu hết các công cụ theo mặc định.

Điều này hoàn toàn là thuận tiện, a. bắt đầu một tên tệp có nghĩa là hoàn toàn không có gì nhưng "người dùng có thể không muốn thấy điều này mọi lúc." Để đảm bảo rằng bạn biết, chạy eg ls -asẽ hiển thị tất cả các tệp.

Nếu bạn không muốn có một tập tin làm lộn xộn danh sách của mình trong Linux, bạn nên đổi tên nó thành bắt đầu bằng dấu chấm (Phần thưởng: điều này cũng sẽ hoạt động với OS X, nếu chúng ta đang nói về một thiết bị di động). Nếu bạn không muốn người dùng có thể tìm thấy một tệp, bạn đã làm sai - đó là quyền cho phép.

Các quyền Unix khi chúng liên quan đến các thư mục thường gây nhầm lẫn cho mọi người và có thể hiểu nó tốt hơn sẽ giúp bạn. Các quyền "đọc" và "thực thi" ( rx) có nghĩa là một cái gì đó khác nhau đối với các thư mục so với các tệp. Đối với các thư mục, xquyền thực thi xác định xem bạn có truy cập các nút trong thư mục hay không. Quyền đọc quyết rđịnh xem bạn có thể truy cập danh sách thư mục hay không. Về mặt chức năng, xcho phép người dùng thực hiện mọi thứ trong một thư mục, trong khi rquyền cho phép họ xem những gì trong đó. Đây là khác nhau, và sự khác biệt có thể gây nhầm lẫn. Hãy xem một ví dụ:


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 ..

Vì vậy, lưu ý rằng không thực thi tôi vẫn có thể liệt kê các tệp (mặc dù ls hiển thị lỗi vì nó không thể nhận được các thuộc tính tệp), nhưng tôi không thể thay đổi thư mục hoặc đọc các tệp trong đó. Không đọc tôi không thể liệt kê các tập tin, nhưng tôi vẫn có thể thay đổi thư mục và nếu tôi biết tên của một tập tin, tôi vẫn có thể truy cập nó.

Tuy nhiên, xin lưu ý rằng việc xóa quyền đọc chỉ mang lại cho bạn sự bảo mật bằng cách che khuất. Nếu người dùng đoán tên tệp, họ sẽ có thể đọc nội dung của nó.

Điều này có thể không thực sự có liên quan đến câu hỏi của bạn, tôi chỉ muốn chắc chắn rằng bạn hiểu quyền truy cập thư mục.


26

Tạo một tệp .hiddentrong thư mục với tên của các tệp sẽ bị ẩn (một tên mỗi dòng).

Sau đó thêm các mục sau vào ~/.bashrc:

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

Bây giờ lslệnh của bạn không liệt kê các tệp này.

Tôi sử dụng kỹ thuật này để ẩn __pycache____init__.pycác tập tin của tôi .


EDIT: theo một nhận xét khác, điều này cũng ẩn chúng trong ít nhất một (Nautilus), nhưng có lẽ một số trình duyệt tệp GUI.


nó là thú vị. Nó cũng hoạt động trong nautilus hoặc các công cụ gui khác? Bạn có thể xem các tập tin với ls -al?
Jakuje

1
mã thiếu một ' "ở cuối (và trong trường hợp bạn tự hỏi nơi upvotes đến từ:. askubuntu.com/a/713591/15811 ) ;-)
Rinzwind

14

Bạn thực sự có thể ẩn các tệp trong Linux mà không cần thêm dấu chấm. Điều này thực sự che giấu chúng trong Nautilus; một lstừ dòng lệnh vẫn sẽ liệt kê các tập tin.

  1. Tạo một tệp văn bản có tên .hiddentrong thư mục mà bạn muốn ẩn các tệp.
  2. Thêm tên của các tệp hoặc thư mục bạn muốn ẩn, mỗi tên một dòng vào tệp.
  3. Làm mới trình duyệt tập tin của bạn.

2
không hoạt động ở đây với "ls" trong debian 5.0. Nó có đặc trưng cho nautilus hay cá heo hay ...?
Tim Haegele

2
Các tập tin được ẩn trong Nautilus; không có trong lsdanh sách
Làm

1
chỉ là giải pháp tuyệt vời! :)
Merianos Nikos

4

Một dấu chấm được sử dụng để ẩn các tệp trong linux và không thể thay đổi.

Tuy nhiên, bạn có thể chơi với các quyền của tệp để ngăn người dùng không thể truy cập vào thư mục / tệp đã cho. Hãy thử trải nghiệm với chmodlệnh.


2

Bạn chỉ đang cố gắng ẩn các tệp khỏi trình quản lý tệp của giao diện người dùng đồ họa và / hoặc môi trường máy tính để bàn? Nếu vậy, có thể có các tùy chọn ngoài việc đơn giản là tiền tố tên tệp bằng dấu chấm.

Tôi tin rằng các tập tin chỉ thêm ẩn bởi bất kỳ quản lý tập tin Linux là các tập tin sao lưu, tức là những người kết thúc trong một dấu ngã ~hoặc .bakhoặc bất cứ điều gì họ tin là phần mở rộng sao lưu. Trong mọi trường hợp, bạn có thể gặp may nếu tất cả những gì bạn muốn làm là ẩn các tệp sao lưu khỏi trình quản lý tệp.

Không cung cấp cho các tệp của bạn một tiện ích mở rộng sao lưu để ẩn chúng hoặc chúng có thể bị xóa vô tình !!

Bên cạnh đó, bạn có thể ẩn các tệp khỏi Finder trong Mac OS X bằng cách sử dụng lệnh SetFile -a V [file]hoặc chỉnh sửa /.hiddennhưng rõ ràng điều này sẽ không ẩn tệp khỏi lschương trình của dòng lệnh .


3
Trong OS X, bạn cũng có thể ẩn tập tin bằng cách chflags hidden filename.
slhck

2

Nếu bạn có một số kỹ năng lập trình và nếu chỉ những gì bạn cần là ẩn tên tập tin cho sự đồng thuận của người dùng để ngăn chặn không gian hình ảnh, bạn có thể hack nó!

Tôi sẽ chỉ xem xét các công cụ dòng lệnh, vì chúng khá thống nhất và là công cụ duy nhất được sử dụng liên tục là tôi.

Có nhiều cách để lưu trữ thông tin này:

  1. Bạn có thể lưu trữ thuộc tính mở rộng "ẩn" trong các tệp đã chọn. Xemman attr

      attr -s hidden -V true your_file
    
  2. Hoặc như đã đề cập ở trên, bạn có thể lưu trữ danh sách tên tệp trong .hiddentệp

Quan trọng: Điều này sẽ không hoạt động ngoài hộp bạn phải thực hiện logic, hệ thống sạch sẽ chỉ bỏ qua .hiddencác tệp và hiddenthuộc tính mở rộng!

Ngoài ra còn có các triển khai có thể có:

  1. Nếu bạn chỉ có vài tệp, hãy ghi vào .bashrctệp của bạn

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

    man ls để biết thêm thông tin.

  2. Viết một function lsví dụ như nó xử lý tất cả logic đằng sau nhận ra các tệp ẩn và danh sách lắp ráp của tất cả -Icác mục, sau đó thực hiện /bin/lsvới các cờ bỏ qua thích hợp. Nhiệm vụ rất tốn công, bởi vì bạn phải xử lý tất cả các lstham số đúng cách.

  3. Lấy nguồn coreutils

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

    hoặc là

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

    Vá nó theo cách bạn cần để xử lý việc thực hiện các tệp ẩn. Và đặt nó trong của bạnPATH

    Tôi đã hack nó sau chưa đầy 5 phút bằng các nguồn không cần thiết và diff là như thế này:

     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.cnằm trong src, không phải thư mục gốc, và không có chức năng lsdirtrong ls.c.
Melab

2

Đây là giải pháp tốt nhất tôi đã tìm thấy, thêm vào hồ sơ của bạn :

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

Nếu bạn cần nhiều mẫu hơn chỉ cần thêm nhiều --ignorecờ.


Điều này sẽ dẫn đến một chuỗi rất, rất dài nếu có nhiều hơn một vài tệp cần được ẩn đi. Đối với nhiều tệp, có nhiều cách hiệu quả hơn để làm điều này, nhưng đối với một vài tệp, dù sao cũng là một giải pháp tốt.
JW0914

2

Ngày nay, bạn có thể viết FUSE ẩn các tệp theo cấu hình đã cho.

Bài viết này khiến tôi tin rằng bạn cần phải điều chỉnh getdirchức năng:

getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Điều này đọc nội dung của một thư mục. Thao tác này là opendir(), readdir(), ..., closedir()trình tự trong một cuộc gọi. Đối với mỗi mục nhập thư mục, filldir()chức năng nên được gọi.

Tôi không phải là lập trình viên nhưng tôi tưởng tượng người ta có thể getdirbỏ qua tất cả các tệp được liệt kê trong tệp (ví dụ) .hidden. Nếu bạn thực hiện điều này một cách chính xác thì mọi công cụ (GUI hoặc không) sẽ bị ảnh hưởng.


1

Bạn có thể 'ẩn' nội dung của một thư mục bằng cách lấy đi 'x' perms cho nhóm hoặc khác : chmod go-x directoryname. Bạn không thể liệt kê các tệp nữa, mặc dù bạn có thể truy cập một tệp nếu bạn biết đường dẫn chính xác. Điều này không giống như những gì bạn muốn.

Hãy nhớ rằng điều dotfile là một sự tiện lợi, không thực sự để ẩn tệp vì mục đích bảo mật, nhưng để giảm sự lộn xộn cho các tệp trong khi liệt kê tệp. Nó được nướng vàols và các công cụ khác.


Và nó cũng không đúng sự thật. Trong khi loại bỏ quyền đọc từ một thư mục ngăn bạn liệt kê nội dung của nó, việc xóa quyền thực thi sẽ từ chối mọi quyền truy cập vào thư mục. Khi bạn không có quyền thực thi một thư mục, bạn sẽ không có quyền truy cập vào bất cứ thứ gì ngoài nó. Ngay cả khi có một thư mục con có đầy đủ quyền trong đó và bạn biết đường dẫn của nó.
Bachsau
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.