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

32

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

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

aWebDeveloper
источник
6
Имейте в виду, что скрытие файлов (обфускация) не является заменой безопасности (ограничение доступа)
uSlackr

Ответы:

26

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

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

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

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

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

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

jcrawfordor
источник
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
в конце кода отсутствует знак «» (и, если вам интересно, откуда взялись эти голоса: askubuntu.com/a/713591/15811 ) ;-)
Rinzwind
14

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

  1. Создайте текстовый файл с именем .hiddenв папке, где вы хотите скрыть файлы.
  2. Добавьте имена файлов или папок, которые вы хотите скрыть, по одному на строку, в файл.
  3. Обновите ваш файловый браузер.
Сделать
источник
2
здесь не работает с "ls" в Debian 5.0. Это специфично для наутилуса или дельфина или ...?
Тим Хэгеле
2
Файлы скрыты в Наутилусе; нет в lsсписках.
Делать
1
просто отличное решение! :)
Мерианос Никос
4

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

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

bbaja42
источник
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. Получить источники 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)
    
Алексей Грабовский
источник
ls.cлежит srcне в корневом каталоге, а lsdirв ls.c.
Мелаб
2

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

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

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

jsmedmar
источник
Это приведет к очень, очень длинной строке, если нужно скрыть несколько файлов. Для нескольких файлов есть более эффективные способы сделать это, но для пары файлов, тем не менее, хорошее решение.
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и другими инструментами.

Рич Гомолка
источник
И это тоже неправда. В то время как удаление разрешений на чтение из каталога не позволяет вам перечислить его содержимое, удаление разрешения на выполнение вообще лишит вас доступа к каталогу. Если у вас нет разрешения на запуск каталога, у вас не будет доступа ни к чему, кроме него. Даже если в нем есть подкаталог с полными правами и вы знаете его путь.
Бахсау