Имейте в виду, что скрытие файлов (обфускация) не является заменой безопасности (ограничение доступа)
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 показывает ошибку, потому что не может получить свойства файла), но я не могу перейти в каталог или прочитать файлы в нем. Без чтения я не могу перечислить файлы, но я все еще могу перейти в каталог, и если я знаю имя файла, я все равно могу получить к нему доступ.
Однако обратите внимание, что удаление разрешения на чтение дает вам безопасность только по незаметности. Если пользователь угадает имя файла, он сможет прочитать его содержимое.
Возможно, это не имело отношения к вашему вопросу, я просто хотел убедиться, что вы понимаете права доступа к каталогу.
Создайте файл .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из командной строки будет еще список файлов.
Создайте текстовый файл с именем .hiddenв папке, где вы хотите скрыть файлы.
Добавьте имена файлов или папок, которые вы хотите скрыть, по одному на строку, в файл.
здесь не работает с "ls" в Debian 5.0. Это специфично для наутилуса или дельфина или ...?
Тим Хэгеле
2
Файлы скрыты в Наутилусе; нет в lsсписках.
Делать
1
просто отличное решение! :)
Мерианос Никос
4
Точка используется для скрытия файлов в Linux, и это не может быть изменено.
Однако вы можете поиграть с правами доступа к файлам, чтобы запретить пользователям доступ к данной папке / файлу. Попробуйте поэкспериментировать с chmodкомандой.
Вы только пытаетесь скрыть файлы из файлового менеджера и / или рабочего стола вашего графического интерфейса пользователя? Если это так, возможны варианты помимо простого добавления префикса к имени файла с точкой.
Я считаю , что только дополнительные файлы , скрытые любого файлового менеджера Linux являются создание резервных копий файлов, то есть те , оканчивающиеся на тильды ~или .bakили то , что они считают , является расширение резервного копирования. В любом случае вам, вероятно, повезет, если все, что вы хотите сделать, это скрыть файлы резервных копий из файлового менеджера.
Не давайте своим файлам расширение для резервного копирования, чтобы скрыть их, иначе они могут быть случайно удалены !!
Кроме того, вы можете скрыть файлы из Finder в Mac OS X с помощью команды SetFile -a V [file]или редактирования, /.hiddenно, очевидно, это не скроет файл из программы командной строки ls.
В OS X вы также можете скрыть файлы chflags hidden filename.
Slhck
2
Если у вас есть некоторые навыки программирования, и если вам нужно только скрыть имена файлов для удобства пользователей, чтобы не загромождать визуальное пространство, вы можете взломать его!
Я рассмотрю только инструменты командной строки, так как они довольно единообразны и являются единственными инструментами, которые постоянно используются мной.
Есть много способов хранить эту информацию:
Вы можете хранить «скрытый» расширенный атрибут в выбранных файлах. Видетьman attr
attr -s hidden -V true your_file
Или, как упоминалось выше, вы можете сохранить список имен файлов в .hiddenфайле
Важно: это не сработает сразу после установки логики, чистые системы будут просто игнорировать .hiddenфайлы и hiddenрасширенные атрибуты!
Также есть несколько возможных реализаций:
Если у вас есть только несколько файлов, напишите в своем .bashrcфайле
alias ls='ls -I filename_1 -I filename_2'
man ls за дополнительной информацией.
Напишите function lsтакой, как он обрабатывает всю логику, стоящую за распознаванием скрытых файлов и сборкой списка всех -Iзаписей, а затем выполняя
/bin/lsс соответствующими флагами игнорирования. Очень трудоемкая задача, потому что вы должны правильно обрабатывать все lsпараметры.
Получить источники 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)
Это приведет к очень, очень длинной строке, если нужно скрыть несколько файлов. Для нескольких файлов есть более эффективные способы сделать это, но для пары файлов, тем не менее, хорошее решение.
JW0914
2
В настоящее время вы можете написать FUSE, который скрывает файлы в соответствии с заданным конфигом.
Эта статья заставляет меня поверить, что вам нужно настроить getdirфункцию:
getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Это читает содержимое каталога. Эта операция opendir(), readdir()..., closedir()в одном вызове. Для каждой записи каталога filldir()должна быть вызвана функция.
Я не программист, но я думаю, что можно было бы getdirопустить все файлы, перечисленные в (например) .hiddenфайле. Если вы реализуете это правильно, то будут затронуты все инструменты (GUI или нет).
Вы можете «скрыть» содержимое директории, убирая «х» завивку для группы, или другой: chmod go-x directoryname. Вы больше не можете перечислять файлы, но можете получить доступ к файлу, если знаете точный путь. Это не похоже на то, что вы хотите.
Имейте в виду, что функция dotfile - это удобство, которое заключается не в том, чтобы скрывать файл ради безопасности, а в том, чтобы уменьшить беспорядок для файлов во время листинга. Он запекается lsи другими инструментами.
И это тоже неправда. В то время как удаление разрешений на чтение из каталога не позволяет вам перечислить его содержимое, удаление разрешения на выполнение вообще лишит вас доступа к каталогу. Если у вас нет разрешения на запуск каталога, у вас не будет доступа ни к чему, кроме него. Даже если в нем есть подкаталог с полными правами и вы знаете его путь.
Ответы:
Вы не можете. Существует принципиальная разница в том, как файловые системы обрабатывают скрытые настройки. В Windows файловая система хранит несколько атрибутов для файла в метаданных, включая атрибуты «скрытый» и «системный» (оба из которых являются разновидностями скрытых файлов). В обычных файловых системах * nix такой атрибут не сохраняется. Вместо этого информация должна быть размещена где-то еще, например, в имени файла. Таким образом, условием является то, что файлы начинаются с. (и в зависимости от вашей системы, возможно, некоторые другие, такие как _) не будут отображаться большинством инструментов по умолчанию.
Это чисто для удобства, а. Начало имени файла означает абсолютно ничего, кроме «пользователь, вероятно, не хочет видеть это все время». Чтобы убедиться, что вы знаете, при запуске eg
ls -a
будут показаны все файлы.Если вы не хотите, чтобы файл загромождал ваши списки в Linux, вам следует переименовать его, чтобы начать с точки (Бонус: это будет работать и для OS X, если мы говорим о портативном устройстве). Если вы не хотите, чтобы пользователи могли найти файл, вы делаете это неправильно - для этого нужны разрешения.
Разрешения Unix, поскольку они относятся к каталогам, часто вводят людей в заблуждение, и, возможно, лучшее понимание поможет вам. Разрешения «чтение» и «выполнение» (
r
иx
) означают что-то другое для каталогов, чем для файлов. Для каталоговx
разрешение на выполнение определяет, есть ли у вас доступ к inode в каталоге. Разрешение на чтениеr
определяет, можете ли вы получить доступ к списку каталогов. Функционально,x
позволяет пользователю делать вещи в каталоге, в то время какr
разрешение позволяет им видеть, что в нем. Они разные, и разница может сбивать с толку. Давайте посмотрим на пример:Итак, обратите внимание, что без execute я все еще могу перечислить файлы (хотя ls показывает ошибку, потому что не может получить свойства файла), но я не могу перейти в каталог или прочитать файлы в нем. Без чтения я не могу перечислить файлы, но я все еще могу перейти в каталог, и если я знаю имя файла, я все равно могу получить к нему доступ.
Однако обратите внимание, что удаление разрешения на чтение дает вам безопасность только по незаметности. Если пользователь угадает имя файла, он сможет прочитать его содержимое.
Возможно, это не имело отношения к вашему вопросу, я просто хотел убедиться, что вы понимаете права доступа к каталогу.
источник
Создайте файл
.hidden
в каталоге с именами файлов, которые будут скрыты (по одному имени в каждой строке).Затем добавьте следующее к вашему
~/.bashrc
:Теперь ваша
ls
команда не перечисляет эти файлы.Я использую эту технику, чтобы скрыть мои
__pycache__
и__init__.py
файлы.РЕДАКТИРОВАТЬ: согласно другому комментарию это также скрывает их, по крайней мере, в одном (Nautilus), но, вероятно, в нескольких браузерах файлов GUI.
источник
ls -al
?На самом деле вы можете скрыть файлы в Linux без добавления точки. Это на самом деле скрывает их в Наутилусе;
ls
из командной строки будет еще список файлов..hidden
в папке, где вы хотите скрыть файлы.источник
ls
списках.Точка используется для скрытия файлов в Linux, и это не может быть изменено.
Однако вы можете поиграть с правами доступа к файлам, чтобы запретить пользователям доступ к данной папке / файлу. Попробуйте поэкспериментировать с
chmod
командой.источник
Вы только пытаетесь скрыть файлы из файлового менеджера и / или рабочего стола вашего графического интерфейса пользователя? Если это так, возможны варианты помимо простого добавления префикса к имени файла с точкой.
Я считаю , что только дополнительные файлы , скрытые любого файлового менеджера Linux являются создание резервных копий файлов, то есть те , оканчивающиеся на тильды
~
или.bak
или то , что они считают , является расширение резервного копирования. В любом случае вам, вероятно, повезет, если все, что вы хотите сделать, это скрыть файлы резервных копий из файлового менеджера.Не давайте своим файлам расширение для резервного копирования, чтобы скрыть их, иначе они могут быть случайно удалены !!
Кроме того, вы можете скрыть файлы из Finder в Mac OS X с помощью команды
SetFile -a V [file]
или редактирования,/.hidden
но, очевидно, это не скроет файл из программы командной строкиls
.источник
chflags hidden filename
.Если у вас есть некоторые навыки программирования, и если вам нужно только скрыть имена файлов для удобства пользователей, чтобы не загромождать визуальное пространство, вы можете взломать его!
Я рассмотрю только инструменты командной строки, так как они довольно единообразны и являются единственными инструментами, которые постоянно используются мной.
Есть много способов хранить эту информацию:
Вы можете хранить «скрытый» расширенный атрибут в выбранных файлах. Видеть
man attr
Или, как упоминалось выше, вы можете сохранить список имен файлов в
.hidden
файлеВажно: это не сработает сразу после установки логики, чистые системы будут просто игнорировать
.hidden
файлы иhidden
расширенные атрибуты!Также есть несколько возможных реализаций:
Если у вас есть только несколько файлов, напишите в своем
.bashrc
файлеman ls
за дополнительной информацией.Напишите
function ls
такой, как он обрабатывает всю логику, стоящую за распознаванием скрытых файлов и сборкой списка всех-I
записей, а затем выполняя/bin/ls
с соответствующими флагами игнорирования. Очень трудоемкая задача, потому что вы должны правильно обрабатывать всеls
параметры.Получить источники coreutils
или
Исправьте это так, как вам нужно для реализации скрытых файлов. И поместите это в свой
PATH
Я взломал его менее чем за 5 минут, используя бесполезные источники, и diff выглядит так:
источник
ls.c
лежитsrc
не в корневом каталоге, аlsdir
вls.c
.Это лучшее решение, которое я нашел, добавьте в свой профиль :
Если вам нужно больше шаблонов, просто добавьте больше
--ignore
флагов.источник
В настоящее время вы можете написать FUSE, который скрывает файлы в соответствии с заданным конфигом.
Эта статья заставляет меня поверить, что вам нужно настроить
getdir
функцию:Я не программист, но я думаю, что можно было бы
getdir
опустить все файлы, перечисленные в (например).hidden
файле. Если вы реализуете это правильно, то будут затронуты все инструменты (GUI или нет).источник
Вы можете «скрыть» содержимое директории, убирая «х» завивку для группы, или другой:
chmod go-x directoryname
. Вы больше не можете перечислять файлы, но можете получить доступ к файлу, если знаете точный путь. Это не похоже на то, что вы хотите.Имейте в виду, что функция dotfile - это удобство, которое заключается не в том, чтобы скрывать файл ради безопасности, а в том, чтобы уменьшить беспорядок для файлов во время листинга. Он запекается
ls
и другими инструментами.источник