在Linux中隐藏文件而不使用点


32

我希望在Linux中隐藏文件而不使用点,因为在Windows中是可能的。

有没有办法做到这一点?


6
请记住,隐藏文件(混淆)不能代替安全性(限制访问)
uSlackr

Answers:


26

你不能。文件系统处理隐藏设置的方式存在根本差异。在Windows中,文件系统在元数据中存储文件的几个属性,包括“隐藏”和“系统”属性(两者都是隐藏文件)。在常见的* nix文件系统中,不存储任何此类属性。而是必须将信息放在其他位置,例如文件名中。因此,约定是以。开头的文件。(根据您的系统,默认情况下,大多数工具不会显示(取决于_)。

纯粹是为了方便起见。以文件名开头绝对没有什么意义,只是“用户可能不想一直看到它”。为了确保您知道,运行eg ls -a将显示所有文件。

如果您不想让文件在Linux上混乱,则应将其重命名为以点开头(奖金:如果我们谈论的是便携式设备,这也适用于OS X)。如果您不希望用户能够找到文件,则说明您做错了-这就是权限的用途。

与目录有关的Unix权限通常会使人们感到困惑,也许更好地理解它会对您有所帮助。“读取”和“执行”权限(rx)对目录的含义与对文件的含义不同。对于目录,执行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文件。


编辑:根据其他评论,这也将它们隐藏在至少一个(Nautilus)中,但也可能隐藏在多个GUI文件浏览器中。


挺有趣的。它也可以在nautilus或其他gui工具中工作吗?您可以通过看到文件ls -al吗?
雅库耶2015年

1
代码末尾缺少一个“”。(以防万一您怀疑Upvotes来自何处:askubuntu.com/a/713591/15811);-)
Rinzwind 2015年

14

实际上,您可以在Linux中隐藏文件而无需添加点。这实际上将它们隐藏在Nautilus中。一个ls命令行仍然会列出文件。

  1. .hidden在要隐藏文件的文件夹中创建一个名为的文本文件。
  2. 将要隐藏的文件或文件夹的名称(每行一个)添加到文件中。
  3. 刷新文件浏览器。

2
在debian 5.0中不能与“ ls”一起使用。它特定于鹦鹉螺或海豚还是...?
蒂姆·海格勒

2
文件隐藏在Nautilus中;不在ls列表中。

1
很棒的解决方案!:)
Merianos Nikos

4

点号用于在Linux中隐藏文件,并且不能更改。

但是,您可以使用文件许可权来防止用户能够访问给定的文件夹/文件。尝试试验chmod命令。


2

您是否只是在试图从图形用户界面的文件管理器和/或桌面环境中隐藏文件?如果是这样,除了简单地在文件名前加点号之外,可能还有其他选择。

相信任何Linux的文件管理器隐藏的唯一附加文件的备份文件,即那些在波浪结束~.bak或任何他们认为是备份扩展。无论如何,如果您只想从文件管理器中隐藏备份文件,那么可能很幸运。

不要给您的文件添加备份扩展名以隐藏它们,否则它们可能会被意外删除!

顺便说一句,您可以使用命令SetFile -a V [file]或编辑从Mac OS X中的Finder隐藏文件,/.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,不是根目录下,并没有什么作用lsdirls.c
Melab 2015年

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

您可以通过删除组的“ x”权限或其他方式来“隐藏”目录的内容chmod go-x directoryname。尽管您知道确切的路径也可以访问文件,但是您无法再列出文件。这听起来不像您想要的。

请记住,dotfile是一种方便,并不是为了安全起见真正隐藏文件,而是减少了文件列表期间文件的混乱情况。它已嵌入ls其他工具中。


这也是不正确的。虽然从目录中删除读取权限会阻止您列出其内容,但是删除执行权限将完全拒绝对该目录的任何访问。如果您没有执行目录的权限,那么您将无权访问目录之外的任何内容。即使其中有一个具有完整权限的子目录,并且您知道其路径也不会。
巴绍(Bachsau)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.