我很好奇是否有人可以帮助我了解保护 Linux 命令行应用程序的潜在破坏性命令行选项的最佳方法是什么?
给出一个非常假设的场景:想象一个命令行程序,它在紧急断电之前设置处理器的最大散热设置。让我们进一步假设有两个主要选项,其中之一是 --max-Temperature(以摄氏度为单位),它可以设置为 30 到 50 之间的任何整数。还有一个覆盖标志 --melt ,它会禁用处理器无论处理器有多热,都不会通过软件关闭,直到系统出现电气/机械故障。
当然,像 --melt 这样的选项是危险的,在最坏的情况下可能会导致物理破坏。但同样,让我们假设这种类型的功能是必需的(尽管很奇怪)。该应用程序必须以 root 身份运行,但如果希望帮助确保 --melt 选项不会因困惑或没有经验的用户而意外触发,您会怎么做?
当然,一个非常常见的反模式(IMO)是隐藏该选项,这样 --help 或手册页就不会透露它的存在,但这是通过模糊性实现的安全性,并且可能会因用户触发它而产生意想不到的后果,但无法找出它的含义。
另一种可能性是将标志更改为命令行参数,要求用户传递 --melt OVERRIDE 或其他一些标记作为他们真正想要执行此操作的标志。
是否有其他机制可以实现相同的目标?
答案1
我假设您是从实用程序程序员的角度来看待这个问题的。这个范围足够广泛,没有(也不可能有)单一的正确答案,但我想到了一些事情。
我认为大多数公用事业公司只有一个“强制”标志(-f
),它会覆盖大多数安全检查。另一方面,egdpkg
有一个更细粒度的开关,其中--force-things
事物可以是多个不同的关键字。
并apt-get
让你在某些情况下写一个完整的句子来验证,比如删除“必要”的包。见下文。 (我认为这不仅仅是一个命令行选项,因为必要的软件包是安装软件包所需的软件包,因此撤消错误的操作可能是非常难的。此外,在apt
有机会计算包依赖关系之前,整个操作可能事先并不知道。)
然后,我认为cdrecord
用于让用户在实际开始工作之前等待几秒钟,以便您有机会在数字减少时验证设置是否正常。
如果您尝试这样做,您会得到以下结果apt-get remove bash
:
WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
bash
0 upgraded, 0 newly installed, 2 to remove and 2 not upgraded.
After this operation, 2,870 kB disk space will be freed.
You are about to do something potentially harmful.
To continue type in the phrase 'Yes, do as I say!'
?] ^C
选择哪一个取决于您作为程序作者 - 您必须根据该操作的危险程度以及您自己的偏执程度来做出决定。 (无论是基于对用户的关心,还是基于担心因混乱而受到指责。)
有可能导致处理器真正(停止并)着火的东西可能会出现在“危险”轴的高端,并且可能需要进行类似“类型‘是的,按我说的做’”的处理。
也就是说,需要认识到的一件事是,许多实际的内核级接口都是不是以任何方式保护。相反,下面的文件/sys
只需打开和写入即可更改内容,除了文件访问权限之外不会提出任何问题。 (即您需要是 root。)
这也适用于硬盘驱动器内容(正如我们应该知道的),并且在两年前的一种情况下,还适用于主板固件的配置变量。似乎有可能用错误的rm -rf
.
不完全是。看lwn.net 文章和系统问题跟踪器。
因此,无论您要实施什么保护措施,您都只会保护使用该特定工具完成的操作。