26

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

Есть ли способ сделать это?

9 ответов9

23

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

Это чисто для удобства, а. начало имени файла означает абсолютно ничего, кроме «пользователь, вероятно, не хочет видеть это все время». Чтобы убедиться, что вы знаете, при запуске, например, ls -a будут показаны все файлы.

Если вы не хотите, чтобы файл загромождал ваши списки в Linux, вы должны переименовать его, чтобы начать с точки (Бонус: это будет работать и для OS X, если мы говорим о портативном устройстве). Если вы не хотите, чтобы пользователи могли найти файл, вы делаете это неправильно - для этого нужны разрешения.

Разрешения Unix, поскольку они относятся к каталогам, часто вводят людей в заблуждение, и, возможно, лучшее понимание поможет вам. Разрешения "чтение" и "выполнение" (r и x) означают что-то другое для каталогов, чем для файлов. Для каталогов разрешение execute x определяет, есть ли у вас доступ к inode в каталоге. Разрешение на чтение 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 ..

Итак, обратите внимание, что без execute я все еще могу перечислить файлы (хотя ls показывает ошибку, потому что не может получить свойства файла), но я не могу перейти в каталог или прочитать файлы в нем. Без чтения я не могу перечислить файлы, но я все еще могу перейти в каталог, и если я знаю имя файла, я все равно могу получить к нему доступ.

Однако обратите внимание, что удаление разрешения на чтение дает вам безопасность только по незаметности. Если пользователь угадает имя файла, он сможет прочитать его содержимое.

Возможно, это не имело отношения к вашему вопросу, я просто хотел убедиться, что вы понимаете права доступа к каталогу.

21

Создайте файл .hidden в каталоге с именами файлов, которые нужно скрыть (по одному имени в каждой строке).

Затем добавьте следующее в ваш ~/.bashrc:

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

Теперь ваша команда ls не перечисляет эти файлы.

Я использую эту технику, чтобы скрыть мои __pycache__ и __init__.py .


12

Вы можете на самом деле скрыть файлы в Linux без добавления точки. Это на самом деле скрывает их в Наутилусе; ls из командной строки будет по-прежнему перечислять файлы.

  1. Создайте текстовый файл с именем .hidden в папке, где вы хотите скрыть файлы.
  2. Добавьте имена файлов или папок, которые вы хотите скрыть, по одному на строку, в файл.
  3. Обновите ваш файловый браузер.
4

Точка используется для скрытия файлов в Linux, и это не может быть изменено.

Однако вы можете поиграть с правами доступа к файлам, чтобы запретить пользователям доступ к данной папке / файлу. Попробуйте поэкспериментировать с командой chmod .

2

Это лучшее решение, которое я нашел, добавьте в свой профиль:

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

Если вам нужно больше шаблонов, просто добавьте больше флагов --ignore .

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. Получить источники coreutils

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

    или же

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

    Установите это так, как вам нужно для реализации скрытых файлов. И поместите это в свой PATH

    Я взломал его менее чем за 5 минут, используя бесполезные источники, и 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)
    
2

В настоящее время вы можете написать FUSE, который скрывает файлы в соответствии с заданным конфигом.

Эта статья заставляет меня поверить, что вам нужно настроить функцию getdir :

getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Это читает содержимое каталога. Эта операция представляет собой последовательность opendir() , readdir() ,…, closedir() в одном вызове. Для каждой записи каталога должна быть вызвана функция filldir() .

Я не программист, но я думаю, что можно заставить getdir опустить все файлы, перечисленные в (например) .hidden файле. Если вы реализуете это правильно, то все инструменты (GUI или нет) будут затронуты.

2

Вы только пытаетесь скрыть файлы из файлового менеджера и / или рабочего стола вашего графического интерфейса пользователя? Если это так, могут быть варианты помимо простого добавления префикса к имени файла с точкой.

Я считаю, что единственными дополнительными файлами, скрытыми любым файловым менеджером Linux, являются файлы резервных копий, то есть те, которые оканчиваются на тильду ~ или .bak или что они считают расширением резервной копии. В любом случае вам, вероятно, повезет, если все, что вы хотите сделать, это скрыть файлы резервных копий из файлового менеджера.

Не давайте вашим файлам расширение для резервного копирования, чтобы скрыть их, иначе они могут быть случайно удалены !!

Кроме того, вы можете скрыть файлы из Finder в Mac OS X, используя команду SetFile -a V [file] или /.hidden но, очевидно, это не скроет файл из программы ls командной строки.

1

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

Имейте в виду, что функция dotfile - это удобство, которое заключается не в том, чтобы скрывать файл в целях безопасности, а в том, чтобы уменьшить беспорядок для файлов во время листинга. Он запекается в ls и других инструментах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .