3

在我的程序中,我必须隐藏一个文件以避免删除或修改文件。

PATH=/etc/
NAME = file

C中有一个函数可以让我这样做吗?

4

8 回答 8

9

您可以.在文件名前面添加一个。话虽如此,如果您的目标是不允许修改文件,请将权限更改为无法修改的内容。就像是:

chmod 444 fileName
于 2013-09-17T14:18:07.547 回答
5

第一:其他人在这里争论安全论点。对于那些:隐藏文件与安全无关,如果他有适当的权限并且想要这样做,它也不会阻止某人删除文件。

隐藏仅意味着lsbash glob 或图形文件管理器等工具不会显示具有默认设置的文件。这对于防止事故(见下面的解释)或只是为了保持目录列表更干净很有用。您可以尝试命令ls -l $HOMEls -al $HOME查看差异。

在 GNU/Linux 系统和 UNIX 上,按照惯例,名称以点开头的文件.默认不会显示,这意味着它们是隐藏的。喜欢$HOME/.bashrc

解决方案:在文件名前加一个点:

.file

关于事故。隐藏文件可以防止您在键入以下内容时意外删除它:

rm *

上面的 glob 不会列出隐藏文件,因此它们不会被删除。

于 2013-09-17T14:17:11.087 回答
2

Linux 上没有隐藏文件。一些工具不显示.以其他已经提到的开头的文件。

无论如何,您可以尝试将控制字符(如换行符)放入文件名中。请参阅文件名中的控制字符是一个糟糕的主意

某些控制字符,尤其是转义 (ESC) 字符,可能会导致各种显示问题,包括安全问题。终端(如 xterm、gnome-terminal、Linux 控制台等)实现控制序列。大多数软件开发人员不明白,如果文件名可以包含控制字符,那么仅仅显示文件名会导致安全问题。默认情况下,GNU ls 程序试图保护用户免受这种影响(请参阅 -N 选项),但是许多人显示文件名而没有被 ls 过滤 - 问题又回来了。HD Moore 的“终端仿真器安全问题”(2003 年)总结了一些安全问题;现代终端模拟器试图禁用最危险的终端模拟器,但它们仍然会造成麻烦。带有嵌入控制字符的文件名可以(当显示时)导致功能键被重命名,设置 X 原子,以误导性方式更改显示,等等。为了解决这个问题,一些程序会修改控制字符(例如 find 和 ls)——这使得正确处理具有此类名称的文件变得更加困难。

于 2013-09-17T14:42:33.323 回答
2

在 LINUX 隐藏文件以.(DOT)

如果您使用starting 创建文件.(DOT),这些文件将被隐藏。

您可以使用chmod 来设置文件的权限。

如果您设置为只读,则无法在程序中修改

chmod 444 filename

如果你想从 C 语言使用system()这个函数来执行这个命令

如果您使用简单 ls -alF,您可以看到这些文件。

以下文件是 LINUX 中的隐藏文件

-rw-------  1 root root   27671 Sep 17 11:40 .bash_history
-rw-r--r--  1 root root    3512 Jul 23 16:30 .bashrc
于 2013-09-17T14:16:56.513 回答
1

您的要求有点含糊:程序创建一个文件,想要阻止它被删除或修改。您是否期望其他用户(您的程序?通常?)能够阅读它,但不容易找到它,或者修改或删除它?

请记住,正如其他人所指出的那样,当所涉及的资源需要保持可见(可能是可读的)时,类 Unix 系统并没有真正隐藏。在前面加上一个“。” 文件名在一些重要的上下文中有所帮助(特别是默认ls(1)行为和 shell *globbing),但仅此而已。但是,如果这很重要,一些技术可能有助于掩盖您的应用程序保存的内容和位置。

考虑两个用户在一个设置了粘性位的目录(比如 /tmp)中执行一些 shell 命令,如下所示。(很抱歉没有写 C,但我认为这个场景更容易在 shell 中演示出来。)

作为鲍勃:

$ umask 066
$ mkdir /tmp/.hidden
$ umask 022
$ echo xyzzy > /tmp/.hidden/mysecret.txt
$ ls -la /tmp/.hidden
total 28
drwx--x--x  2 bob  users 4096 Sep 17 11:19 .
drwxrwxrwt 27 root root 20480 Sep 17 11:26 ..
-rw-r--r--  1 bob  users    6 Sep 17 11:19 mysecret.txt

作为爱丽丝。请注意,尝试在 /tmp/.hidden 中搜索失败,但如果她知道目录中仅设置了执行但未设置读取权限的文件的名称,则她可以读取该文件。一旦正确创建了/tmp/.hidden,她就不能做太多事情了。如果她被迫猜测秘密文件的名称,这也可能是一个挑战,具体取决于名称的创建方式。

$ ls /tmp | grep hidden
$ ls -a /tmp | grep hidden
.hidden
$ file /tmp/.hidden
/tmp/.hidden: directory
$ ls /tmp/.hidden 
ls: cannot open directory /tmp/.hidden: Permission denied
$ echo /tmp/.hidden/*
/tmp/.hidden/*
$ file /tmp/.hidden/mysecret.txt
/tmp/.hidden/mysecret.txt: ASCII text
$ cat /tmp/.hidden/mysecret.txt
xyzzy
$ rm -f /tmp/.hidden/mysecret.txt
rm: cannot remove '/tmp/.hidden/mysecret.txt': Permission denied
$ mv /tmp/.hidden /tmp/Hidden_No_More
mv: cannot move '/tmp/.hidden' to '/tmp/Hidden_No_More': Operation not permitted
$ rm -rf /tmp/.hidden 
rm: cannot remove '/tmp/.hidden': Permission denied

在这种情况下,隐藏目录的存在可能会被掩盖,但会ls -a显示其名称。精心选择的目录权限可防止非 root 和非 Bob 用户列出或更改其内容。使用像 /tmp 这样的粘性位目录可以防止非 Bobs 重命名或删除“隐藏”目录。任何知道隐藏目录中“秘密”文件名称的人都可以阅读它。但只有 Bob 和 root 可以更改这些“秘密”文件或“隐藏”目录。

您可以在 C 程序中完成以上所有操作;等价物以库和系统调用的形式存在 - 参见chmod(2), mkdtemp(3), umask(2), 的 mode 参数open(2)等。

于 2013-09-17T17:13:17.180 回答
1

如果您使用 >= 3.11 的内核,您可能想尝试使用O_TMPFILE-flag。该内核已于 14.09.2013 发布。Debian Jessie 使用内核 3.16。所以这个特性应该在所有最近流行的发行版上都可用。

这方面的消息听起来很有希望。该文件将无法从外部访问。没有其他进程或可能访问此文件.. 既不读也不写。但是一旦句柄关闭,文件就会丢失。或将其链接到常规文件。但是,它将可以像任何其他文件一样访问。

如果这不是您的选择(例如,您的文件需要持久化):运气不好。linux 中没有真正的“隐藏”文件。您可以使用 hidden 属性隐藏持久文件,就像 Windows 上的文件一样安全:在名称前加上一个点。正如其他人所说:ls -a仍然会向他们展示。

此外,您可以创建一个专门供您使用的用户,并使文件仅对该用户可读写,或者将其放在只有您的用户具有读写权限的文件夹中。其他用户可能会看到此文件,但无法访问它。但如果root出现并想调查它,你就输了。

于 2013-09-17T19:25:08.553 回答
0

当然,您必须添加“。” 在文件名之前,用户将看不到您的文件(用户将打开隐藏文件显示选项除外)。您可以将 attrybutes (chmod) 更改为 755,只有用户可以 rwx,其他人可以 rx。

于 2013-09-17T14:20:36.607 回答
0

hek2mgl - 部分是的 - 它有。尝试通过rm -rf *方式删除所有目录内容。这就是为什么例如 .htaccess 被隐藏的原因。

于 2013-09-17T14:45:18.537 回答