在我的程序中,我必须创建一个隐藏文件,以避免删除或修改文件
PATH=/etc/
NAME = file
所以我问c中是否有功能允许这样做?
谢谢
答案 0 :(得分:7)
您只需在文件名前面添加.
即可。话虽如此,如果你的目标是不允许修改文件,则将权限更改为无法修改的内容。类似的东西:
chmod 444 fileName
答案 1 :(得分:3)
首先:其他人在这里争论安全论点。对于那些:隐藏文件与安全性无关,也不会阻止某人删除文件,如果他有权限并且想要这样做。
隐藏仅表示ls
,bash globs或图形文件管理器等工具不会显示默认设置的文件。这对于防止发生事故(请参阅下面的说明)或仅保持目录列表更加清洁非常有用。您可以尝试使用ls -l $HOME
和ls -al $HOME
命令来查看差异。
在GNU / Linux系统和UNIX上,按照惯例,默认情况下不会显示名称以点.
开头的文件,这意味着它们是隐藏的。与$HOME/.bashrc
解决方案:使用点前缀文件名:
.file
关于事故。隐藏文件可以防止您在键入以下内容时意外删除它:
rm *
上面的glob不会列出隐藏文件,因此不会被删除。
答案 2 :(得分:2)
在LINUX中,隐藏文件以.(DOT)
如果您创建的文件以.(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
答案 3 :(得分:1)
Linux上没有隐藏文件。有些工具不会像其他人已经提到的那样显示以.
开头的文件。
无论如何,您可以尝试将控制字符(如new-line)放入文件名中。见Control characters in filenames are a terrible idea:
某些控制字符,尤其是转义(ESC)字符,可能会导致各种显示问题,包括安全问题。终端(如xterm,gnome-terminal,Linux控制台等)实现控制序列。大多数软件开发人员都不明白,仅显示文件名如果可以包含控制字符,就会导致安全问题。 GNU ls程序默认尝试保护用户不受此影响(请参阅-N选项),但许多人显示文件名而不会被ls过滤 - 并且问题会返回。 H. D. Moore的“终端仿真器安全问题”(2003)总结了一些安全问题;现代终端仿真器试图禁用最危险的终端模拟器,但它们仍然会造成麻烦。具有嵌入控制字符的文件名可以(显示时)导致重命名功能键,设置X原子,以误导方式更改显示,等等。为了解决这个问题,一些程序会修改控制字符(例如find和ls) - 这样就更难以正确处理具有这些名称的文件。
答案 4 :(得分:1)
您的要求有点模糊:程序创建一个文件,希望阻止其删除或修改。您是否希望其他用户(您的程序?一般?)能够阅读,但不能轻易找到,或修改或删除它?
请记住,当所涉及的资源需要保持可见(可读,可能)时,类Unix系统并不真正隐藏,正如其他人所指出的那样。预先设置'。'文件名有助于一些重要的上下文(默认ls(1)
行为和shell *
特别是通配)但只是到目前为止。但是,如果重要的话,一些技巧可能有助于模糊应用程序保存内容的位置和位置。
考虑两个用户在设置了粘滞位的目录(例如/ 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)
,open(2)
的模式参数等内容。
答案 5 :(得分:1)
如果你使用内核> = 3.11,你可能想尝试O_TMPFILE
- 标志。该内核已于2013年9月14日发布。 Debian Jessie使用内核3.16。因此,此功能应该适用于所有最近流行的发行版。
关于此sounds promising的新闻。该文件将无法从外部访问。没有其他进程或可能访问此文件..既不读也不写。但是一旦句柄关闭,文件就会丢失。或者将其链接到常规文件。但是,它可以像任何其他文件一样访问。
如果这不是你的选择(例如你的文件需要持久):运气不好。 linux中没有真正的“隐藏”文件。您可以使用隐藏属性将持久性文件隐藏为具有安全性的窗口上的文件:在名称前添加一个点。正如其他人所说的那样:ls -a
会向他们展示。
此外,您可以专门为您的用户创建一个用户,并使该文件只能为该用户读取和写入,或者将其放在一个文件夹中,只有您的用户具有rw访问权限。其他用户可能会看到此文件但无法访问它。但如果root
出现并希望调查它,那么你就输了。
答案 6 :(得分:0)
当然,你必须添加'。'在文件名之前,用户不会看到您的文件(用户将打开隐藏文件显示选项)。您可以将attrybutes(chmod)更改为755,只有用户可以rwx,其他人可以rx。
答案 7 :(得分:0)
hek2mgl - 部分是 - 它有。尝试通过rm -rf *
方式删除所有目录内容。这就是为什么例如.htaccess被隐藏的原因。