如何从 Linux shell 中删除“exit”命令

如何从 Linux shell 中删除“exit”命令

我正在使用 Linux Ubuntu 16.04。
在本次挑战中,我想从 Linux shell 中删除一些命令。

具体来说,我想删除该exit命令。
我希望如果用户尝试使用此命令退出 shell,则这是不可能的,甚至可能会发送一些消息。

知道我该怎么做吗?
我搜索了一个名为exit
find / -name exit

但它只找到目录:

/usr/src/linux-headers-4.13.0-41-generic/include/config/have/exit
/usr/src/linux-headers-4.13.0-41-generic/include/config/have/irq/exit
/usr/src/linux-headers-4.13.0-43-generic/include/config/have/exit
/usr/src/linux-headers-4.13.0-43-generic/include/config/have/irq/exit
/usr/src/linux-headers-4.13.0-36-generic/include/config/have/exit
/usr/src/linux-headers-4.13.0-36-generic/include/config/have/irq/exit
/usr/src/linux-headers-4.15.0-43-generic/include/config/have/exit
/usr/src/linux-headers-4.15.0-43-generic/include/config/have/irq/exit

编辑:
我读这里关于trap像这样使用trap "ENTER-COMMAND-HERE" EXIT,我尝试过trap "sh" EXIT,但它仍然存在外壳。

答案1

此外特登说了什么exit(基本上用别名或函数覆盖特殊的内置命令), bashshell 还允许您禁用内置命令。

要禁用exit内置命令:

enable -n exit

要禁止再次启用它,还要禁用enable内置命令:

enable -n enable

请注意,就像 terdon 的答案一样,这只会影响当前的 shell 会话,除非它是作为系统范围 shell 启动文件的一部分实现的。

就我个人而言,我几乎只使用Ctrl+D退出交互的外壳会话。要在 中规避此问题bash,请设置IGNOREEOF为某个大整数并使其只读:

readonly IGNOREEOF=1000

这使得 shell 在按Ctrl+D1000 次后退出。

你还可以带有例如的外壳kill -s HUP "$$"。您可以使 shell 忽略挂断信号

trap '' HUP

虽然没有办法阻止用户用信号强行杀死 shell KILL,但您可以像上面那样删除内置kill命令并安装覆盖 shell 函数或别名,但它仍然很容易使用/bin/kill

enable -n kill
kill () { echo 'kill: Operation not permitted' >&2; }

您还可以通过以下方式退出 shell

set -e
false

...显然,除非您禁用set内置功能,但这可能太过分了,就像试图通过其他几种不太明显的方式来阻止退出一样(其中一些,您想阻止它们,需要修改源bash代码)。


问题与

trap 'bash' EXIT

是当当前 shell 退出时它将生成一个新的 shell。不过,新 shell 很容易退出,因为它尚未设置陷阱,除非您将陷阱安装为 shell 启动文件的一部分。

这也不妨碍您退出shell,因为严格来说,陷阱不会执行,直到 shell 实际执行退出。它给你的是一个新的外壳。

答案2

没有exit可执行文件,这是 shell 的内置命令之一(你没有说是什么 shell,所以我假设bash)。因此,完全删除它的唯一方法是编辑 shell 的源代码并重新编译它(但是看看@Kusalananda的回答以获得更好的方法)。

作为替代方案,您可以将类似的内容添加到/etc/bash.bashrc

alias exit='echo "You can check-out any time you like, but you can never leave!"'

但任何对 *nix 了解一点点的人都可以轻松规避这一点。

相关内容