Сховати файли в Linux без використання крапки


32

Я хочу приховати файли в Linux без використання крапки, оскільки це можливо в Windows.

Чи є спосіб це зробити?


6
Майте на увазі, що приховування файлів (притуплення) не є заміною безпеки (обмеження доступу)
uSlackr

Відповіді:


26

Ви не можете. Існує принципова різниця в тому, як файлові системи обробляють приховані налаштування. У Windows файлова система зберігає кілька атрибутів для файлу в метаданих, включаючи атрибути "прихований" та "системний" (обидва - це види прихованих файлів). У загальних файлових системах * nix такий атрибут не зберігається. Натомість інформацію потрібно помістити десь в іншому місці, наприклад, у назві файлу. Таким чином, це умова, що файли, що починаються з. (і залежно від вашої системи, можливо, деякі інші, як-то _) більшість інструментів за замовчуванням не відображатимуться.

Це виключно для зручності, a. починати ім'я файлу не означає абсолютно нічого, але "користувач, ймовірно, не хоче бачити це весь час". Щоб переконатися, що ви знаєте, запуск, наприклад ls -a, покаже всі файли.

Якщо ви не хочете, щоб файл переповнював ваші списки в Linux, вам слід перейменувати його, щоб почати з крапки (бонус: це буде працювати і для OS X, якщо ми говоримо про портативний пристрій). Якщо ви не хочете, щоб користувачі мали змогу знайти файл, ви робите це неправильно - саме для цього є дозволи.

Дозволи на Unix, оскільки вони стосуються каталогів, часто бентежать людей, і, можливо, краще зрозуміти це допоможе вам. Дозволи «читання» і «виконати» ( rі x) середнє що - то інше для каталогів , ніж вони роблять для файлів. Для каталогів xдозвіл на виконання визначає, чи отримуєте ви доступ до входів у каталозі чи ні. 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файли.


EDIT: за іншими коментарями, це також приховує їх принаймні в одному (Nautilus), але, ймовірно, і в декількох браузерах файлів GUI.


це цікаво. Чи працює це також у наутилусі чи інших інструментах gui? Чи можете ви бачити файли за допомогою ls -al?
Jakuje

1
в кінці відсутній знак "" (і якщо вам цікаво, звідки беруть участь:: askubuntu.com/a/713591/15811 ) ;-)
Rinzwind

14

Фактично ви можете приховати файли в Linux, не додаючи крапки. Це насправді приховує їх у Наутілусі; lsз командного рядка буде ще список файлів.

  1. Створіть текстовий файл із іменем .hiddenу папці, куди потрібно заховати файли.
  2. Додайте до файлу імена файлів або папок, які хочете приховати, по одній на рядок.
  3. Оновіть браузер файлів.

2
не працює тут з "ls" в debian 5.0. Це специфічно для наутилуса чи дельфіна чи ...?
Тім Хегеле

2
Файли приховані в Наутілусі; не в lsсписках.
До

1
просто приголомшливе рішення! :)
Меріанос Нікос

4

Точка використовується для приховування файлів у Linux, і це неможливо змінити.

Однак ви можете грати з дозволами на файл, щоб запобігти доступу користувачів до заданої папки / файлу. Спробуйте експериментувати з chmodкомандою.


2

Ви лише намагаєтесь приховати файли з файлового менеджера та / або середовища робочого столу вашого графічного користувальницького інтерфейсу? Якщо так, то можуть бути варіанти, крім простої префіксації імені файла крапкою.

Я вважаю, що єдиними додатковими файлами, прихованими будь-яким файловим менеджером Linux, є файли резервного копіювання, тобто ті, що закінчуються у тильді ~чи, .bakабо що вони вважають, є розширенням резервного копіювання. У будь-якому випадку вам, мабуть, пощастить, якщо все, що ви хочете зробити, це приховати резервні файли від файлового менеджера.

Не дайте файлам розширення для резервного копіювання, щоб їх приховати, інакше вони можуть бути випадково видалені !!

Крім того, ви можете приховати файли з Finder в Mac OS X за допомогою команди SetFile -a V [file]або редагування, /.hiddenале очевидно, що це не приховає файл із програми командного рядка ls.


3
В OS X ви також можете приховати файли за допомогою chflags hidden filename.
slhck

2

Якщо у вас є якісь навички програмування, і якщо тільки те, що вам потрібно, ховається назви файлів для зручності користувачів, щоб перестати захаращувати візуальний простір, ви можете зламати його!

Я розгляну лише інструменти командного рядка, оскільки вони є досить однорідними і є єдиними інструментами, які постійно використовуються.

Існує багато способів зберігання цієї інформації:

  1. Ви можете зберігати "прихований" розширений атрибут у вибраних файлах. Побачитиman attr

      attr -s hidden -V true your_file
    
  2. Або як зазначено вище, ви можете зберігати список імен файлу у .hiddenфайлі

Важливо: це не вийде з поля, у якому вам доведеться реалізувати логіку, чисті системи просто ігнорують .hiddenфайли та hiddenрозширені атрибути!

Також є багато можливих реалізацій:

  1. Якщо у вас є лише кілька файлів, запишіть у свій .bashrcфайл

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

    man ls для отримання додаткової інформації.

  2. Напишіть function lsтакий, як він обробляє всю логіку, розпізнаючи приховані файли та збираючи список усіх -Iзаписів, а потім виконуючи /bin/lsправильними ігноруючими прапорами. Дуже трудомістке завдання, адже ви повинні правильно обробити всі lsпараметри.

  3. Отримайте джерела основних елементів

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

    або

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

    Виправте це так, як вам потрібно обробити реалізацію прихованих файлів. І помістіть його у своєPATH

    Я зламав його менше, ніж за 5 хвилин, використовуючи безлітні джерела, і різниця така:

     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.
Мелаб

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

Ви можете «приховати» вміст директорії, прибираючи «х» завивку для групи, або інший: chmod go-x directoryname. Більше не можна було перераховувати файли, хоча ви могли отримати доступ до файлу, якби знали точний шлях. Це не схоже на те, що ви хочете.

Майте на увазі, що справа в dotfile - це зручність не для того, щоб приховувати файл задля безпеки, але щоб зменшити безлад для файлів під час переліку файлів. Це запікається lsі в інших інструментах.


І це теж неправда. Якщо видалення дозволів на читання з каталогу не дозволяє перелічити його вміст, видалення дозволу на виконання взагалі забороняє доступ до каталогу. Якщо у вас немає дозволу на виконання каталогу, ви не матимете доступу до нічого, що знаходиться поза ним. Навіть якщо в ньому є підкаталог з повними правами, і ви знаєте його шлях.
Бахсау
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.