我正在尝试编辑 reboot 命令以向用户回显一条消息,但命令本身位于/sbin
已编译。是否可以编辑该命令并让其在用户键入 reboot 时打印出一些内容?
答案1
是的,但是您必须编辑其源代码,添加警告,重新编译并用修改后的可执行文件替换可执行文件。
一个更简单的方法是创建一个打印警告的脚本,然后调用reboot
并将该脚本保存为reboot
:
创建包含以下内容的文件并将其保存为
/usr/bin/reboot
:#!/bin/sh echo "Eeeek! You are rebooting!" /sbin/reboot
使其可执行:
sudo chmod a+x /usr/bin/reboot
现在,当您运行时reboot
,因为在您的/usr/bin
之前,您将运行打印警告的脚本,然后运行。/sbin
$PATH
reboot
答案2
正如 terdon 所展示的,其中一种方法是使用包装脚本。
另一种方法是通过function
。函数名称优先于系统命令和别名,这意味着如果我们创建函数重新启动,它将被执行。方便之处在于您不必创建单独的文件,您可以将其放入/etc/bash.bashrc
所有用户或~/.bashrc
仅供您自己使用。
至于函数本身,我们可以这样做
reboot()
{
printf "Reboot is about to happen , press enter "
read
/sbin/reboot
# or for those who like to use systemd way, you can do systemctl reboot
}
同样很酷的是,你可以按Ctrl+C取消此功能
答案3
修改命令的最简单方法是创建一个别名来掩盖它,并使用不同的参数或在执行其他操作之前/之后调用它。
您可以像这样创建别名:
alias ALIASNAME='COMMAND'
不要担心给别名赋予与其包含的命令相同的名称,您不能在这里生成递归。
因此,要首先打印一条消息,等待几秒钟,最后重新启动,该命令是合适的:
echo "Rebooting in 10 seconds - abort with CTRL+C" && sleep 10 && reboot
现在我们需要将这个长命令别名为reboot
,以便运行它而不是原始/sbin/reboot
命令:
alias reboot='echo "Rebooting in 10 seconds - abort with CTRL+C" && sleep 10 && reboot'
此别名现在仅对当前用户有效,并且仅对此 Bash 会话有效。关闭终端窗口将使其再次消失。
为了使它对您的用户帐户持久有效,我们必须确保 Bash 每次启动新会话时都运行它。最简单的方法是将其附加到您的~/.bash_aliases
文件中。用您最喜欢的文本编辑器打开它。如果它尚不存在,只需创建它。
将上面的命令附加alias reboot='...'
到文件末尾。如果需要,您还可以添加注释来描述此内容。注释行必须以字符开头#
。完成编辑后保存文件。
当您现在打开一个新的终端窗口时,别名将会起作用。
请注意,此方法适用于 16.04,其中(无论出于何种原因)/sbin/reboot
不再需要以 root 身份运行,但也可以满足普通用户权限。如果您使用/sbin/reboot
仍需要以 root 身份或使用 运行的旧版本,则必须在别名命令中sudo
添加:sudo
alias reboot='echo "Rebooting in 10 seconds" && sleep 10 && sudo reboot'
sudo
使用(即)运行别名本身sudo ALIASNAME
将不起作用,因为别名特定于用户的 Bash 会话。