这可能与rm命令无关,因为有简单的方法可以删除文件而不使用它。如果问题是您的朋友无意间滥用了该rm命令,那么专门限制该命令的使用或导致该命令以不同方式工作的解决方案可能会有所帮助。相反,如果问题是您的朋友故意以您不想要的方式处理数据,则您需要实施实际的安全措施,并且没有解决方案着眼于rm命令本身(或任何离散的命令集)将使您安全。
您需要控制访问权限,还是只是防止诚实的错误?
假设您的朋友知道您不希望他们删除文件,则有两种可能性:
他们可能是故意这样做的。在这种情况下,您的朋友有意删除您的文件,您甚至不能信任他们尝试遵守您对使用计算机时如何处理数据的要求。正如托马斯·沃德(Thomas Ward)详细解释的那样,解决此问题的唯一方法是使用实际有效的安全措施。通常,最好的措施是阻止他们使用您的计算机。但是让他们使用自己的用户帐户可以提供一定的保护。
他们可能会错误地这样做。在这种情况下,您的朋友极容易发生意外,并且他们继续运行rm他们本来希望没有的命令。他们想尊重您和您的数据,但实际上在实践中却很糟糕,因为他们会继续运行错误的命令,删除错误的文件……之类的东西。尽管最好相信这是正在发生的事情,但我告诫您不要假设那些在您告诉他们停止数据后继续删除您的数据的人没有恶意地在工作。
此外,即使他们的意图很好,给他们一个单独的用户帐户仍然是防止他们删除文件的最简单的方法,除了不允许他们使用您的计算机。
如果情况确实是#2-您的朋友不是在尝试删除您的文件,而是需要帮助,不要意外删除它们,而他们意外删除它们的唯一方法是无意间滥用了少量命令(例如rm)他们在正确使用上有特别的麻烦-那么Videonauth答案中的技术可能有用。但是您必须了解它们不是安全措施,因为该rm命令只是删除文件的许多简便方法之一。有关详情,请参见下文。
我建议您问自己:“我的情况与我(而不是其他使用我的计算机的人)使用rm错误的情况基本相同吗?”
如果答案为否,则这是信息安全问题,您需要阻止朋友使用您的用户帐户。如果答案是肯定的,那么你可以使用同样的方法,如果你想使用你是我的唯一滥用rm:
教育。您的朋友需要知道他们在做什么以及如何避免。
界面更改。在不丧失删除文件的实际能力(需要单独的用户帐户)的情况下,您可以通过使其仅自行运行而不进行任何进一步的操作来立即删除它,从而使意外删除文件变得更加困难。Videonauth的答案为此提供了一种方法。在这个答案中,我提出另一个。rm filefile
但是,即使您的朋友没有尝试做任何错误的事情,您仍然应该考虑让他们使用自己的单独用户帐户。这仍将解决问题-保护数据免遭故意破坏的相同安全措施也将保护其免受意外破坏。即使没有恶意的意图,如果某人继续做您不希望他们做的事情,那么您也不能相信他们会拒绝这样做。
制作rm之前缺失可以帮助提示防止一些错误。
为了帮助人们避免意外删除文件rm,可以设置rm一个实际运行的shell别名rm -i。将-i标志传递给rm导致它在删除每个文件之前提示用户(请参阅参考资料man rm)。
您可以通过添加alias rm='rm -i'到.bash_aliases或.bashrc文件中(针对您的用户帐户)执行此操作。有关详细信息,请参见此问题和该问题。这将对您新打开的bash shell生效。
这没有提供任何实际的安全性,并且在防止错误方面也不是万无一失的,因为:
出现提示时,他们可以选择继续删除。
他们可以通过多种方式绕过别名,包括通过运行/bin/rm或取消别名(unalias rm)。
在许多情况下不会发生别名扩展,并且在这些情况下rm将不会使用别名扩展-i。
他们仍然可以通过使用不需要的任何技术来删除文件rm(就像Videonauth的方法一样 -见下文)。
他们仍然可以在不删除任何文件的情况下损坏数据,例如通过覆盖它们或以其他方式更改其内容(Videonauth的方法也是如此)。
但是,如果您不需要实际的安全性(请参见上文),那么这可能是可行的方法。与防止您的朋友使用系统提供的rm命令的方法相比:
别名化rm对rm -i防止错误的效果不佳-直到他们继续使用其他技术来删除文件为止。到那时rm,即使他们没有尝试做任何错误,阻止他们使用也将完全无效,因为大概他们将以unlink相同的粗心大意来使用(或其他无数个删除文件的命令)。
另一方面,由于别名扩展仅在某些情况下发生-粗略地说,是对shell的常规交互式使用-您的朋友可能会认为,在未真正提示时会提示他们(因为该命令位于例如脚本,或从其他外壳发布)。Videonauth的方式不存在此问题,这是该方法相对于的客观优势alias rm='rm -i'。
运行脚本时,除非故意编写脚本以使用别名,否则不会在其中扩展别名。这意味着混叠rm到rm -i是不太可能打破任何东西。这是的客观优势alias rm='rm -i'。
rm 不能做任何其他完美的普通程序不能做的事情。
真的没有什么特别的rm。这是一种方便且自文档记录的删除文件的方式,因此限制对其的访问可能会破坏许多依赖该文件的脚本。但这不是删除文件的唯一方法,它只是一个普通程序。
一些命令执行某些任务,如果不运行这些命令,受限用户(非root用户)将无法执行这些命令。例如,sudo在确保您被允许进行检查之后,允许您以其他用户身份运行程序。passwd编辑存储用户密码的数据库,但只能让您更改自己的密码(除非您是root用户,在这种情况下,您可以更改任何人的密码)。
/usr/bin/sudo并/usr/bin/passwd可以这样做,因为它们设置了setuid位,如s在运行时显示在最左列中的所示ls -l:
ek@Io:~$ type -a sudo passwd rm
sudo is /usr/bin/sudo
passwd is /usr/bin/passwd
rm is /bin/rm
ek@Io:~$ ls -l /usr/bin/sudo /usr/bin/passwd /bin/rm
-rwxr-xr-x 1 root root 60272 Feb 18 2016 /bin/rm
-rwsr-xr-x 1 root root 54256 Mar 29 2016 /usr/bin/passwd
-rwsr-xr-x 1 root root 136808 Aug 17 09:20 /usr/bin/sudo
请注意,/bin/rm有没有s:它的权限-rwxr-xr-x,而/usr/bin/passwd和/usr/bin/so有-rwsr-xr-x代替。这样,无论谁运行passwd或sudo,它实际上都以root用户身份运行,因为root是可执行文件的所有者。(还有一个setgid位,设置该位后,将使可执行文件以其组所有者而不是调用者的组身份运行。)
除了那些没有被发现(或已经发现但尚未被修补)的任何安全漏洞,sudo并且passwd是安全的,因为工具都是非常精心编写的,使他们只能做的事情,调用者应该允许去做。
/bin/rm这样行不通。它不是setuid的,因为它不需要。目录权限(有时是文件权限)控制用户可以删除哪些文件,而无需成为root用户即可删除。只是为了清楚起见,请永远不要将setuid位设置为onrm。从那时起,安全隐患将是灾难性的,从那时起,无论由谁运行rm,就好像是root在运行它!(实用程序喜欢sudo并passwd检查谁真正在运行它们,并在执行某项操作之前先检查是否已允许;rm请勿执行此类操作。)
检查是否在可执行文件上设置了setuid(或setgid)位将告诉您是否限制谁可以运行它可以提高安全性。不是setuid(或setgid)的可执行文件没有任何特殊状态,任何人都可以简单地复制它们并运行该副本,从另一台计算机上带来他们自己的副本,编写执行相同操作的脚本或程序,或使用另一个程序来做。
不删除文件 rm
不rm使用Ubuntu 删除文件的一种明显方法是导航到图形文件浏览器中的位置(如果使用的是Unity或GNOME Shell,则为Nautilus)并删除文件。还有许多命令可用于从终端删除文件,而无需使用rm。
例如,要删除foo.txt当前目录中的文件,可以在Ubuntu上直接使用且不需要访问的以下命令即可rm实现。(可以肯定的是,我在16.04最低系统上进行了测试删除后仅安装了标准系统实用程序/bin/rm。)
unlink foo.txt
busybox rm foo.txt
perl -e 'unlink("foo.txt")'
python3 -c 'import os; os.remove("foo.txt")'(python而不是python3在较早的版本中)
当然,这个清单还远远不够完整。无法提供此类命令的完整列表。防止文件删除是单独的用户帐户以及存在要实现的文件和目录权限的事情之一。他们很好地防止了这种情况。相反,更改rm命令(使其要求输入密码或以任何其他方式)或限制访问rm根本不会阻止它。