问题: 如何包装 Linux 命令以便在执行命令之前要求进行验证?
例子:
$> shutdown -r now
Please verify the host you are shutting down by typing the hostname: myhost.example.com
Verification passed, shutting down now
理由:我们最近发生了一起事件,一名生产工程师在错误的机器上运行了破坏性命令,管理层要求我们对某些破坏性命令进行验证检查。
挑战:我们需要包装各种命令类型,有些可能是systemctl
正在执行的命令、脚本或二进制文件。
答案1
- 将二进制文件移动到不是在 $PATH 中
- 创建一个 bash 脚本来执行所需的验证并将其存储在某个位置里面你的路径。
mv /sbin/shutdown /opt/shutdown
touch /sbin/shutdown
chmod +x /sbin/shutdown
然后用执行您想要的操作的 bash 脚本替换它。
#!/bin/bash
echo "do whatever"
/opt/shutdown $@
该行将/opt/shutdown $@
把所有命令行参数传递给真实的二进制。
答案2
您可以使用您最喜欢的配置管理系统针对关键系统创建的别名。
you_sure() {
if [[ $- =~ i ]] # only on interactive shells
then
read -p 'OPERATION ON LIVE PRODUCTION ENVIRONMENT! ARE YOU SURE? [N/y]: ' -n 1 -r
echo
fi
if [[ ! $- =~ i || $REPLY =~ ^[Yy]$ ]]
then
"$CMD" "$@"
fi
}
alias shutdown='CMD=shutdown you_sure'
通过在命令前加上斜杠,也可以实现简单的绕过:$ \shutdown -r now