Linux命令行下创建文本界面对话框
最近接了一些外包的活,主要是基础环境部署。大部分比较简单但是重复性工作,如安装JDK、Nginx、OpenSSH升级等。如果编写 ansible 个人觉得比较麻烦,于是上网搜了一下发现 dialog 这么一个小工具。只要维护好图形化里的安装表就可以快速安装一些单节点中间件工具。
必须要线安装 dialog 包
sudo yum install dialog
Dialog 脚本
#!/bin/bash
LOG_FILE="/tmp/install.log"
# 菜单选项列表
MENU_ITEMS=(
1 "显示当前日期和时间"
2 "查看系统信息"
3 "列出当前目录文件"
4 "安装 JDK21"
5 "安装 nginx 1.26"
6 "安装 polardbx"
7 "退出"
)
show_menu() {
dialog --title "菜单" --menu "选择一个操作:" 30 40 20 \
"${MENU_ITEMS[@]}" \
2> /tmp/choice.txt
# 检查 dialog 的退出状态
if [[ $? -ne 0 ]]; then
echo "cancel" > /tmp/choice.txt
fi
}
# 通用安装函数
install_software() {
local script_name=$1
local software_name=$2
# 检查脚本是否存在
if [[ ! -f "$script_name" ]]; then
dialog --msgbox "${software_name} 安装脚本不存在: $script_name" 10 50
return
fi
> "$LOG_FILE"
(
echo "开始安装 ${software_name}..." >> "$LOG_FILE"
sleep 1
sh "$script_name" >> "$LOG_FILE" 2>&1
if [[ $? -eq 0 ]]; then
echo "${software_name} 安装成功!" >> "$LOG_FILE"
else
echo "${software_name} 安装失败,请检查日志!" >> "$LOG_FILE"
fi
) &
dialog --title "安装 ${software_name} 日志" --tailbox "$LOG_FILE" 20 60
wait
dialog --msgbox "安装完成!请检查日志以确认结果。" 10 50
}
perform_action() {
local choice=$(< /tmp/choice.txt)
case $choice in
1)
dialog --msgbox "当前日期和时间:$(date)" 10 50
;;
2)
dialog --msgbox "系统信息:$(uname -a)" 10 50
;;
3)
dialog --msgbox "当前目录文件列表:$(ls)" 10 50
;;
4)
install_software "jdk.sh" "JDK"
;;
5)
install_software "nginx.sh" "Nginx"
;;
6)
install_software "polardbx.sh" "Polardbx"
;;
7 | cancel)
exit_script
;;
*)
dialog --msgbox "无效选择,请重新输入。" 10 50
;;
esac
}
exit_script() {
clear
exit 0
}
# 主循环
while true; do
show_menu
perform_action
done
中间件脚本
安装 JDK
脚本之类编写就可以简单些,并不需要复杂的环境。
#!/bin/bash
set -x
tar -xf jdk-21_linux-x64_bin.tar.gz -C /usr/local
cat <<EOF >> /etc/profile
# JDK environment variables
export JAVA_HOME=/usr/local/jdk-21.0.5
export PATH=\${PATH}:\${JAVA_HOME}/bin:\${JAVA_HOME}/lib
EOF
echo "无法自动 source 需要手动执行一下"
编译安装 Nginx
#!/bin/bash
set -x
tar -xf nginx-1.26.2.tar.gz -C /root
cd /root/nginx-1.26.2
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make && make install