我正在使用 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
(基本上用别名或函数覆盖特殊的内置命令), bash
shell 还允许您禁用内置命令。
要禁用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 了解一点点的人都可以轻松规避这一点。