如何禁用可怕的终端命令?
我正在使用SSH访问远程Ubuntu服务器,而无权访问物理服务器。我以为我是shutdown
在Ubuntu操作系统上运行的NoSQL服务器中键入' ',但实际上我告诉Ubuntu服务器要关闭。然后,我不得不告诉服务器管理员我做了什么,以便他可以为我启动物理服务器。太尴尬了!
如何避免再次发生这种情况?
如何禁用可怕的终端命令?
我正在使用SSH访问远程Ubuntu服务器,而无权访问物理服务器。我以为我是shutdown
在Ubuntu操作系统上运行的NoSQL服务器中键入' ',但实际上我告诉Ubuntu服务器要关闭。然后,我不得不告诉服务器管理员我做了什么,以便他可以为我启动物理服务器。太尴尬了!
如何避免再次发生这种情况?
Answers:
标准答案是“不要以root用户身份登录”。以root身份运行的所有命令都很可怕。如果不是这样,您可以在其中添加一些别名命令.bashrc
以禁用您发现特别可怕的命令。例如:
for scary in shutdown halt reboot rm
do
alias $scary="echo If you really want to do that, type: `which $scary`"
done
然后,如果您键入shutdown,您将收到以下消息:
If you really want to do that, type: /sbin/shutdown
(请确保您.bashrc
有第一次加载,你试试这个之前在生产服务器上)
退出当前ssh
会话并再次登录,或使用. ~/.bashrc
应该加载/运行.bashrc。也许尝试在rm
不带任何参数的情况下运行,以确保您的服务器没有禁用自动.bashrc
登录或类似功能。
请注意,如果您主要关注停机和关机,则可以考虑安装molly-guard,这将使您在关闭机器之前输入主机名。如果您定期在命令行中关闭整个操作系统,但要确保关闭正确的操作系统,则此功能将更为有用。
您也可以使用不太可怕的命令(例如注销或退出)进行测试。
source
是.
所有shell 的别名,并非所有shell都支持。
~/.bash_profile
源.bashrc
,这不是标准行为,并且在大多数系统上,.bashrc
通过ssh登录时不会被读取,因此这不会有所不同。最好将别名添加到~/.profile
或~/.bash_profile
代替。
sudo
存在是有原因的-使用它。命令(在本例中为交互式CLI)完成后,您将转储回用户级外壳程序,而不是root外壳程序。根目录外壳中几乎没有值得的理由。(我很惊讶这还不是答案...)
话虽如此,不要使用一个布偶sudo
的一切。了解您在做什么,并了解为什么需要/不需要root特权。
另外,您可以区分输入root /用户shell的提示。这也使您更明显地回到了shell提示符,而不是“ 其他CLI ”。Mine非常丰富多彩,并且具有许多有用的信息(例如主机名),这使得知道命令将在哪个主机上执行变得非常简单,并且还可以更轻松地回顾历史记录和查找提示-根目录Shell使用默认提示。
这更适合在“ 您的 ”帐户上使用,但是如果您认真对待安全性/系统管理,那么您将不会共享密码/帐户,并且您也不会坐在root shell中而不会完全意识到。
正如人们一遍又一遍地说的那样,“使用别名命令创建一个安全的环境是一个坏主意 ”。您将在安全的环境中感到舒适,在不应该输入的地方输入“可怕”命令。然后有一天,您将换工作,或登录到新计算机,然后繁荣发展“ 糟糕,我不是故意的,对不起 ” ...
sudo shutdown
吗?如果他在错误的机器上执行它,那仍然是一场灾难。
sudo
是一个shell命令,它与数据库无关。
sudo shutdown
,因为我假设sudo
这不是NoSQL命令。不在root用户外壳中将完全解决该问题,这是一个非常好的主意。因此在运行重要命令之前,请仔细查看提示。
软件包“ molly-guard”(至少在Debian衍生的系统上)将在关机,停止,关机和重新启动周围安装包装程序。如果它检测到该终端是远程终端,它将提示输入主机名。如果不匹配,则命令被取消。
rm -rf /
呢?
set -u
在某些情况下可能会有所帮助,例如在编写时rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT
。
--no-preserve-root
,您都不太可能偶然输入这些需求。
我接受了一个我非常喜欢的答案,但是,如果其他人正在阅读并且想要一个简单的答案,这是我的。
找到.bashrc文件,并将其放在最后一行:
alias shutdown=notforuse
然后,当您键入shutdown时,您会得到类似 ~bash: notforuse is not a command
这可能很愚蠢,但是很简单并且可以正常工作。我非常感谢用更好的方法来解决问题的答案!
rm
用来诱骗人们的–alias rm='echo "You can't use rm!" #'
notforuse
路径上曾经调用过有效命令,这将变得非常混乱。
~/.SaveMyReputation
,并添加您作为最后一行.bashrc
一条线的[ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation
。您可能最终希望echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"
在该文件内添加额外的一行。至少您可能会将此别名文件带到其他计算机上(应该是.bash_aliases
,但是在这种“不建议使用”的情况下,最好使用另一个名称)。
alias shutdown=shutdown-disabled-by-an-alias
。(这仅解决了@DavidRicherby指出的第三个也是最次要的问题。)尽管下一个人从看到notforuse is not a command
到运行type -a shutdown
并找到别名,然后键入sudo \shutdown
以禁用别名扩展,可能仍然只需要2秒。(假设它们已经使用sudo
别名,sudo='sudo '
因此它将在其第一个arg中扩展别名)。
对于shutdown
(reboot
,halt
以及相关的):我有问我,如果我真的相信(和它什么都不做反正)的副本。我将此类脚本存储在中/usr/local/sbin
。在Debian上,它具有其他优先级/sbin
(它是PATH的第一个目录)。
系统脚本使用完整路径,因此此类黑客阻止了我停止远程服务器而不是本地计算机(Awesome WM 的不良行为),但是没有其他间接影响,并且在真正需要时我仍然可以将它们用作/ sbin / shutdown 。
shutdown
在没有您的hack 的关键系统上键入。
Sudoers文件提供的粒度级别比仅允许*'允许使用sudo'*更为精细,特别是,您可以使用命令别名来创建特定用户或组受限的命令组白名单。我曾与仅限于ssh访问并允许无密码sudo的远程服务器一起使用(我们确实需要受密码保护的ssh密钥)。这样做有一些很好的理由,但是这样做确实有危险,因此我们使用命令别名允许不受限制地访问他们需要执行的操作(重新启动服务器等),而不会授予他们不需要的权限。
还有语法说“无法运行此命令”。可以解决此问题,因此不应将其用作真正的安全措施,但可以在您描述的情况下使用。
Man sudoers有一些很好的例子说明了如何进行全部设置。
当然,这需要使用sudo,但这应该不用说。
您可能已经成为一些新的Ubuntu愚蠢的受害者。
Ubuntu以前有普通的经典shutdown
命令,该命令需要一个强制性的时间参数。
如果我输入shutdown
,即使是普通用户,也会在Ubuntu 12上发生以下情况:
$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.
然后
$ shutdown +100
shutdown: need to be root.
现在,这里是Ubuntu 16.10。我不是root:
$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to cancel.
不带任何参数的情况下,即使您不是root用户,它也会安排60秒钟后关闭,这只是一个具有管理员权限的帐户。
怪罪典范。
/sbin/shutdown
systemd-sysv
默认情况下是由软件包提供的,所以这不是Ubuntu的愚蠢,而是systemd
愚蠢,它不是来自Ubuntu,而是至少来自Debian,这反过来似乎使systemd
Red Hat受益匪浅。指责时,要指责正确的实体,而不仅仅是您不喜欢的实体。
对于停机,有防霉剂。您只需要安装它,当您尝试通过ssh关闭时,它会要求您键入主机名。
要删除文件,可以使用libtrash之类的解决方案,它可以通过LD_PRELOAD
库模拟垃圾箱。
然后,您可以使用maybe程序测试要更改/删除/ ...的文件。测试某些东西时,这非常酷。
maybe
件事似乎在设计上是被打破的:使用no-ops中断某些syscall将使所有依赖这些syscall成功的非平凡程序崩溃。
尝试以下操作:在远程Shell上时,每次您要键入“返回”键时,请停止5秒钟,然后将手指悬停在“返回”键上,然后重新读取要发送的命令。可以吗 你确定吗?
这似乎很苛刻,但是,另一方面,我们不应该在远程Shell上花费很多时间。我们应该找到所有使维护工作自动化的方法,这样我们几乎根本不需要登录到远程服务器。
shutdown
,停了5秒钟,重新读了命令(大声!),我确定它是正确的。然后按Enter键,命令将立即执行。恐怕这并没有禁用可怕的命令。我会尝试用手指悬停的东西,也许距离太小/太大。
rm
比副作用更严重的副作用shutdown
。底线:如果您始终以root用户身份运行随机命令,则无法防止发生不良情况。