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

Mel*_*res 83 ssh terminal ubuntu

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

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

我怎样才能避免这种情况再次发生?

gma*_*tht 203

标准答案是“不要以 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
Run Code Online (Sandbox Code Playgroud)

然后,如果您键入 shutdown 您将收到以下消息:

If you really want to do that, type: /sbin/shutdown
Run Code Online (Sandbox Code Playgroud)

(在生产服务器上尝试之前请确保.bashrc已先加载)

退出当前ssh会话并再次登录,或使用. ~/.bashrc应加载/运行 .bashrc。也许尝试在rm没有任何参数的情况下运行以确保您的服务器没有禁用.bashrc登录或类似的自动加载。

请注意,如果您主要关心暂停和关机,您可以考虑安装molly-guard,这将使您在关闭机器之前输入主机名。如果您定期在命令行上关闭整个操作系统,但要确保关闭正确的操作系统,这将更有用。

你也可以用一个不那么可怕的命令来测试试试这个,比如注销或退出。

  • 根据我的经验,将“可怕”命令别名为“安全”行为是一个坏主意。这是因为人们倾向于养成命令以非标准方式工作的习惯,这会使他们在使用普通系统时做出一些非常令人遗憾的事情。简单的答案是在以 root 身份登录时要非常小心。 (145认同)
  • _不要以 root 身份登录_:如果您混淆了您登录的机器,这将无济于事。我建议 [更改提示](https://askubuntu.com/questions/145618/how-can-i-shorten-my-command-line-bash-prompt) 给你一个视觉提示。 (70认同)
  • @isanae 我用来通过 ssh 打开终端到生产服务器的快捷方式会使终端背景呈红色。这让我很注意。 (22认同)
  • `source` 是 `.` 的别名,并非所有 shell 都支持。 (6认同)
  • 还要注意,虽然 Debian 和 Ubuntu 有默认的 `~/.bash_profile` 源 `.bashrc`,这不是标准行为,在大多数系统上,通过 ssh 登录时不会读取 `.bashrc`,所以这不会有什么不同。最好将别名添加到`~/.profile` 或`~/.bash_profile`。 (4认同)
  • @terdon 别名不会被子进程继承,它们旨在用于交互式 shell。`.bashrc` 正是它们所属的地方。将 `[[ $- = *i* ]] && source .bashrc` 添加到 `.bash_profile` 的末尾是一个好主意,以确保 `.bashrc` 是为交互式登录 shell 提供的。 (4认同)
  • @MrLister :问题是当人们养成期待牵手的习惯时,他们遇到了一个尚未完成的系统。几十年前,我在我们大学的主要计算中心工作,我们没有这样的牵手。工程部门将“rm”别名为“rm -i”。所以有人来了,输入`rm *`,认为它会提示他们删除哪些文件......并丢失了该目录中的所有内容。 (4认同)
  • 您还可以使用 `\shutdown` 代替 `/sbin/shutdown` 来绕过别名(至少在 bash 中)。 (3认同)
  • @isanae 我最近读到有人的生产 root shell 是一个很好的 5 行 ascii 艺术警告,它是生产中的 root 终端。我是那种东西的粉丝。 (3认同)
  • @isanae 这么多。我曾经坐在一个人旁边,他们认为自己在使用自己的机器时不小心对生产服务器进行了分叉轰炸……这是一个缓慢而痛苦的认识。以及为什么我在生产服务器上的提示右侧有 ``☢prod☢`` 的原因:) (2认同)

Att*_*tie 73

sudo存在是有原因的——使用它。当您的命令(在本例中为交互式 CLI)完成后,您将被转储回用户级 shell,而不是 root shell。很少有值得使用 root shell 的理由。(我很惊讶这还不是答案......)

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


此外,您可以区分对 root / 用户 shell 的提示。这也使您更明显地返回到 shell 提示符而不是“其他一些 CLI ”。我的非常丰富多彩,并且有很多有用的信息(例如主机名),这使得知道命令将在哪个主机上执行变得非常简单,并且还可以更轻松地回顾历史和定位提示 - 根shell 使用默认提示。

我的 PS1

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


正如人们一遍又一遍地说的那样“使用别名命令来营造安全环境是一个坏主意”。你会在安全的环境中感到舒适,在不应该输入那些“可怕”的命令的地方。然后有一天你会换工作,或者登录一台新机器,然后轰隆一声哎呀,我不是故意的,对不起”......

  • [`sudo` 轮到你喝咖啡了。](http://freesoftwaremagazine.com/articles/bizarre_cathedral_95/) (7认同)
  • @Barmar:实际上我认为 OP 的目的是将它输入到 NoSQL cmdline 程序中,而不是输入到 bash 中。所以他们不会输入 `sudo shutdown`,因为我认为 `sudo` 不是 NoSQL 命令。不在 root shell 中会完全解决这个问题,这是一个非常好的主意。所以在运行重要命令之前会仔细查看提示。 (4认同)
  • “sudo shutdown”他不会有同样的问题吗?如果他在错误的机器上执行它,那仍然是一场灾难。 (2认同)
  • @Barmar NoSQL 理解 sudo 命令吗? (2认同)
  • @Taemyr `sudo` 是一个 shell 命令,它与数据库无关。 (2认同)

CSM*_*CSM 44

'molly-guard' 包(至少在 Debian 派生系统上)将在关机、暂停、关机和重启周围安装一个包装器。如果检测到终端是远程终端,则会提示输入主机名。如果不匹配,则取消该命令。

  • @marcellothearcane `set -u` 在某些情况下可能会有所帮助,例如在编写 `rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT` 时。 (9认同)
  • @the0ther,一个 2 岁的孩子,他在同一天两次触发了恐龙机器上的 SCRAM 开关。房间里的人在开关上盖上了盖子。http://www.catb.org/jargon/html/M/molly-guard.html (7认同)
  • 其他(可以说是更可怕的)东西呢,比如`rm -rf /`? (4认同)
  • @marcellothearcane 在类似于现代 Linux 系统的任何东西上,都需要 `--no-preserve-root`,您不太可能意外输入。 (4认同)
  • 谁是莫莉,我想知道……可能是某人的猫。 (3认同)
  • @CSM 那是一些不错的计算机书呆子人类学萌芽。谢谢! (2认同)