如何禁用可怕的终端命令?


82

如何禁用可怕的终端命令?

我正在使用SSH访问远程Ubuntu服务器,而无权访问物理服务器。我以为我是shutdown在Ubuntu操作系统上运行的NoSQL服务器中键入' ',但实际上我告诉Ubuntu服务器要关闭。然后,我不得不告诉服务器管理员我做了什么,以便他可以为我启动物理服务器。太尴尬了!

如何避免再次发生这种情况?


100
对此进行了详细的讨论,通常涉及到rm比副作用更严重的副作用shutdown。底线:如果您始终以root用户身份运行随机命令,则无法防止发生不良情况。
德米特里·格里戈里耶夫

5
正如其他人提到的有关别名的那样,这样做会使人们“养成以非标准方式工作的命令的习惯”。那么对其他人来说,愚蠢的NoSQL服务器使用此命令是否看起来很糟糕?
bmb

我使用的NoSQL服务器是Redis。
MelodiousFires

60
只是不要在root帐户下工作。
ALK

12
我敢说您已经学到了这一课,因此不必感到需要再次禁用任何命令。我还要补充一点,您不是傻瓜GNU / Linux,您会比傻瓜变得更好。

Answers:


204

标准答案是“不要以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,这将使您在关闭机器之前输入主机名。如果您定期在命令行中关闭整个操作系统,但要确保关闭正确的操作系统,则此功能将更为有用。

您也可以使用不太可怕的命令(例如注销或退出)进行测试。


70
不要以root用户身份登录:如果您混淆了所登录的计算机,这将无济于事。我建议将提示更改为可以给您视觉提示的内容。
isanae

145
以我的经验,使“吓人的”命令混淆为“安全的”行为是一个坏主意。这是因为人们倾向于养成以非标准方式工作的命令的习惯,这会使他们在香草系统上做一些非常令人遗憾的事情。简单的答案是以root用户身份登录时要非常小心。
TimGJ

22
@isanae我用来通过ssh打开生产服务器的终端的快捷方式会使终端背景变为红色。那使我注意了。
Peter A. Schneider

6
source.所有shell 的别名,并非所有shell都支持。
gronostaj

4
还要注意,尽管Debian和扩展的Ubuntu具有defaullt ~/.bash_profile.bashrc,这不是标准行为,并且在大多数系统上,.bashrc通过ssh登录时不会被读取,因此这不会有所不同。最好将别名添加到~/.profile~/.bash_profile代替。
terdon

73

sudo存在是有原因的-使用它。命令(在本例中为交互式CLI)完成后,您将转储回用户级外壳程序,而不是root外壳程序。根目录外壳中几乎没有值得的理由。(我很惊讶这还不是答案...)

话虽如此,不要使用一个布偶sudo一切。了解您在做什么,并了解为什么需要/不需要root特权。


另外,您可以区分输入root /用户shell的提示。这也使您更明显地回到了shell提示符,而不是“ 其他CLI ”。Mine非常丰富多彩,并且具有许多有用的信息(例如主机名),这使得知道命令将在哪个主机上执行变得非常简单,并且还可以更轻松地回顾历史记录和查找提示-根目录Shell使用默认提示。

我的PS1

这更适合在“ 您的 ”帐户上使用,但是如果您认真对待安全性/系统管理,那么您将不会共享密码/帐户,并且您也不会坐在root shell中而不会完全意识到。


正如人们一遍又一遍地说的那样,“使用别名命令创建一个安全的环境是一个坏主意 ”。您将在安全的环境中感到舒适,在不应该输入的地方输入“可怕”命令。然后有一天,您将换工作,或登录到新计算机,然后繁荣发展“ 糟糕,我不是故意的,对不起 ” ...



2
他不会有同样的问题sudo shutdown吗?如果他在错误的机器上执行它,那仍然是一场灾难。
Barmar

2
@Barmar NoSQL理解sudo命令吗?
Taemyr

2
@Taemyr sudo是一个shell命令,它与数据库无关。
Barmar

4
@Barmar:实际上,我认为OP的意思是将其键入NoSQL cmdline程序,而不是bash。所以他们不会输入sudo shutdown,因为我假设sudo这不是NoSQL命令。不在root用户外壳中将完全解决该问题,这是一个非常好的主意。因此在运行重要命令之前,请仔细查看提示。
彼得·科德斯

44

软件包“ molly-guard”(至少在Debian衍生的系统上)将在关机,停止,关机和重新启动周围安装包装程序。如果它检测到该终端是远程终端,它将提示输入主机名。如果不匹配,则命令被取消。


4
其他(可能更可怕)的东西rm -rf /呢?
marcellothearcane

9
@marcellothearcane set -u在某些情况下可能会有所帮助,例如在编写时rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT
亚历克斯·霍尔

4
@marcellothearcane在类似于现代Linux系统的任何事物上--no-preserve-root,您都不太可能偶然输入这些需求。
CVn

3
谁是莫莉,我想...可能是某人的猫。
the0ther

7
@ the0ther,一个2岁的孩子,在同一天两次触发了恐龙机器上的SCRAM开关。他们在房间里的人在开关上盖了盖子。 catb.org/jargon/html/M/molly-guard.html
CSM

4

我接受了一个我非常喜欢的答案,但是,如果其他人正在阅读并且想要一个简单的答案,这是我的。

找到.bashrc文件,并将其放在最后一行:

alias shutdown=notforuse

然后,当您键入shutdown时,您会得到类似 ~bash: notforuse is not a command

这可能很愚蠢,但是很简单并且可以正常工作。我非常感谢用更好的方法来解决问题的答案!


4
嗯,我过去常常是rm用来诱骗人们的–alias rm='echo "You can't use rm!" #'
MD XF

52
我认为这是一个坏主意,原因有三点。首先,这对其他具有root访问该计算机权限的人来说很混乱。其次,它会训练您可以键入“ shutdown”并按Enter,这意味着您可能在具有root用户访问权限的下一个系统上犯同样的错误。第三,如果notforuse路径上曾经调用过有效命令,这将变得非常混乱。
David Richerby

5
我与@DavidRicherby在一起。这不是一个好主意。
Tico

如果你真的想使用的别名,你至少可以把所有这些吓唬命令别名,在文件中,让我们说~/.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,但是在这种“不建议使用”的情况下,最好使用另一个名称)。
Hastur

如果您要执行此操作,请使用像这样的名称,以减少混乱alias shutdown=shutdown-disabled-by-an-alias。(这仅解决了@DavidRicherby指出的第三个也是最次要的问题。)尽管下一个人从看到notforuse is not a command到运行type -a shutdown并找到别名,然后键入sudo \shutdown以禁用别名扩展,可能仍然只需要2秒。(假设它们已经使用sudo别名,sudo='sudo '因此它将在其第一个arg中扩展别名)。
彼得·科德斯

1

对于shutdownreboothalt以及相关的):我有问我,如果我真的相信(和它什么都不做反正)的副本。我将此类脚本存储在中/usr/local/sbin。在Debian上,它具有其他优先级/sbin(它是PATH的第一个目录)。

系统脚本使用完整路径,因此此类黑客阻止了我停止远程服务器而不是本地计算机(Awesome WM 的不良行为),但是没有其他间接影响,并且在真正需要时我仍然可以将它们用作/ sbin / shutdown 。


仅当您将它们应用于登录过的每台计算机时,此类hack才起作用……这通常是非常不切实际的,直到为时已晚,您才发现:shutdown没有您的hack 的关键系统上键入。
jpaugh

@jpaugh:是的,这是一个hack,我仅将其用于我经常登录的个人服务器,并且终端保持打开状态的时间过多。[注意:我的个人计算机还使用了不同的颜色提示:远程root,远程用户,local-root,本地用户]。对于真实的服务器和远程计算机,我避免使用root,并且尽可能少地使用root,并且可以肯定,不要忘记退出它们。只是我将我的遥控器用作“云”(在云炒作之前,因此以旧方式处理)。
Giacomo Catenazzi

1

Sudoers文件提供的粒度级别比仅允许*'允许使用sudo'*更为精细,特别是,您可以使用命令别名来创建特定用户或组受限的命令组白名单。我曾与仅限于ssh访问并允许无密码sudo的远程服务器一起使用(我们确实需要受密码保护的ssh密钥)。这样做有一些很好的理由,但是这样做确实有危险,因此我们使用命令别名允许不受限制地访问他们需要执行的操作(重新启动服务器等),而不会授予他们不需要的权限。

还有语法说“无法运行此命令”。可以解决此问题,因此不应将其用作真正的安全措施,但可以在您描述的情况下使用。

Man sudoers有一些很好的例子说明了如何进行全部设置。

当然,这需要使用sudo,但这应该不用说。


1

您可能已经成为一些新的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秒钟后关闭,这只是一个具有管理员权限的帐户。

怪罪典范。


6
/sbin/shutdown systemd-sysv默认情况下是由软件包提供的,所以这不是Ubuntu的愚蠢,而是systemd愚蠢,它不是来自Ubuntu,而是至少来自Debian,这反过来似乎使systemdRed Hat受益匪浅。指责时,要指责正确的实体,而不仅仅是您不喜欢的实体。
Ruslan

1
@Ruslan没有人将这些废话打包到他们的发行版中去逃避愚蠢的责任。
卡兹(Kaz)

0

对于停机,有防霉剂。您只需要安装它,当您尝试通过ssh关闭时,它会要求您键入主机名。

要删除文件,可以使用libtrash之类的解决方案,它可以通过LD_PRELOAD库模拟垃圾箱。

然后,您可以使用maybe程序测试要更改/删除/ ...的文件。测试某些东西时,这非常酷。


1
maybe件事似乎在设计上是被打破的:使用no-ops中断某些syscall将使所有依赖这些syscall成功的非平凡程序崩溃。
德米特里·格里戈里耶夫

-2

尝试以下操作:在远程Shell上时,每次您要键入“返回”键时,请停止5秒钟,然后将手指悬停在“返回”键上,然后重新读取要发送的命令。可以吗 你确定吗?

这似乎很苛刻,但是,另一方面,我们不应该在远程Shell上花费很多时间。我们应该找到所有使维护工作自动化的方法,这样我们几乎根本不需要登录到远程服务器。


试过了,不起作用。我进入shutdown,停了5秒钟,重新读了命令(大声!),我确定它是正确的。然后按Enter键,命令将立即执行。恐怕这并没有禁用可怕的命令。我会尝试用手指悬停的东西,也许距离太小/太大。
wojciech_rak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.