commit
dca5072c34
344
shell/diy.sh
344
shell/diy.sh
@ -9,11 +9,29 @@ readonly UNAME_U
|
||||
# COLORS
|
||||
readonly COLOUR_RESET='\e[0m'
|
||||
readonly aCOLOUR=(
|
||||
'\e[38;5;154m' # green | Lines, bullets and separators
|
||||
'\e[1m' # Bold white | Main descriptions
|
||||
'\e[90m' # Grey | Credits
|
||||
'\e[91m' # Red | Update notifications Alert
|
||||
'\e[33m' # Yellow | Emphasis
|
||||
'\e[38;5;154m' # 绿色 - 用于行、项目符号和分隔符 0
|
||||
'\e[1m' # 粗体白色 - 用于主要描述
|
||||
'\e[90m' # 灰色 - 用于版权信息
|
||||
'\e[91m' # 红色 - 用于更新通知警告
|
||||
'\e[33m' # 黄色 - 用于强调
|
||||
'\e[34m' # 蓝色
|
||||
'\e[35m' # 品红
|
||||
'\e[36m' # 青色
|
||||
'\e[37m' # 浅灰色
|
||||
'\e[92m' # 浅绿色9
|
||||
'\e[93m' # 浅黄色
|
||||
'\e[94m' # 浅蓝色
|
||||
'\e[95m' # 浅品红
|
||||
'\e[96m' # 浅青色
|
||||
'\e[97m' # 白色
|
||||
'\e[40m' # 背景黑色
|
||||
'\e[41m' # 背景红色
|
||||
'\e[42m' # 背景绿色
|
||||
'\e[43m' # 背景黄色
|
||||
'\e[44m' # 背景蓝色19
|
||||
'\e[45m' # 背景品红
|
||||
'\e[46m' # 背景青色21
|
||||
'\e[47m' # 背景浅灰色
|
||||
)
|
||||
|
||||
readonly GREEN_LINE=" ${aCOLOUR[0]}─────────────────────────────────────────────────────$COLOUR_RESET"
|
||||
@ -48,19 +66,55 @@ GreyStart() {
|
||||
ColorReset() {
|
||||
echo -e "$COLOUR_RESET\c"
|
||||
}
|
||||
|
||||
InitBanner() {
|
||||
echo -e "${GREEN_LINE}"
|
||||
echo -e " https://github.com/wukongdaily/diy-nas-onescript"
|
||||
echo -e "${GREEN_LINE}"
|
||||
echo -e ""
|
||||
}
|
||||
|
||||
# 定义红色文本
|
||||
RED='\033[0;31m'
|
||||
# 无颜色
|
||||
NC='\033[0m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW="\e[33m"
|
||||
|
||||
declare -a menu_options
|
||||
declare -A commands
|
||||
menu_options=(
|
||||
"启用SSH服务"
|
||||
"安装注音输入法(新酷音输入法)"
|
||||
"安装常用办公必备软件(office、QQ、微信、远程桌面等)"
|
||||
"安装虚拟机VirtualBox 7"
|
||||
"安装虚拟机VirtualBox 7扩展包"
|
||||
"虚拟机一键格式转换(img2vdi)"
|
||||
"设置虚拟机开机自启动(headless)"
|
||||
"VirtualBox硬盘直通"
|
||||
"创建root身份的VirtualBox图标"
|
||||
"刷新虚拟硬盘的UUID"
|
||||
"准备CasaOS的使用环境"
|
||||
"安装CasaOS(包含Docker)"
|
||||
"还原配置文件os-release"
|
||||
"配置docker为国内镜像"
|
||||
"安装btop资源监控工具"
|
||||
"卸载虚拟机"
|
||||
"卸载 CasaOS"
|
||||
)
|
||||
|
||||
commands=(
|
||||
["启用SSH服务"]="enable_ssh"
|
||||
["安装虚拟机VirtualBox 7"]="install_virtualbox"
|
||||
["安装虚拟机VirtualBox 7扩展包"]="install_virtualbox_extpack"
|
||||
["虚拟机一键格式转换(img2vdi)"]="convert_vm_format"
|
||||
["设置虚拟机开机自启动(headless)"]="set_vm_autostart"
|
||||
["卸载虚拟机"]="uninstall_vm"
|
||||
["准备CasaOS的使用环境"]="prepare_for_casaos"
|
||||
["安装CasaOS(包含Docker)"]="install_casaos"
|
||||
["还原配置文件os-release"]="restore_os_release"
|
||||
["卸载 CasaOS"]="uninstall_casaos"
|
||||
["配置docker为国内镜像"]="configure_docker_mirror"
|
||||
["安装常用办公必备软件(office、QQ、微信、远程桌面等)"]="install_need_apps"
|
||||
["安装注音输入法(新酷音输入法)"]="install_fcitx5_chewing"
|
||||
["安装btop资源监控工具"]="enable_btop"
|
||||
["VirtualBox硬盘直通"]="attach_raw_disk_to_vm"
|
||||
["创建root身份的VirtualBox图标"]="create_root_vm_desktop"
|
||||
["刷新虚拟硬盘的UUID"]="refresh_vm_disk_uuid"
|
||||
|
||||
)
|
||||
|
||||
# 函数:检查并启动 SSH
|
||||
enable_ssh() {
|
||||
@ -321,8 +375,7 @@ setautologin() {
|
||||
sudo rm -rf ~/.local/share/keyrings/*
|
||||
}
|
||||
|
||||
# 设置开机5秒后
|
||||
# 自动启动所有虚拟机(无头启动)
|
||||
# 设置虚拟机自启动
|
||||
do_autostart_vm() {
|
||||
# 检查系统上是否安装了VirtualBox
|
||||
if ! command -v VBoxManage >/dev/null; then
|
||||
@ -339,9 +392,16 @@ do_autostart_vm() {
|
||||
# 获取当前用户名
|
||||
USERNAME=$(whoami)
|
||||
|
||||
# 获取当前所有虚拟机的名称并转换为数组
|
||||
VMS=$(VBoxManage list vms | cut -d ' ' -f 1 | sed 's/"//g')
|
||||
VM_ARRAY=($VMS)
|
||||
# 获取普通用户创建的虚拟机列表
|
||||
USER_VMS=$(VBoxManage list vms | cut -d ' ' -f 1 | sed 's/"//g')
|
||||
USER_VM_ARRAY=($USER_VMS)
|
||||
|
||||
# 获取root用户创建的虚拟机列表
|
||||
ROOT_VMS=$(sudo VBoxManage list vms | cut -d ' ' -f 1 | sed 's/"//g')
|
||||
ROOT_VM_ARRAY=($ROOT_VMS)
|
||||
|
||||
# 合并两个虚拟机数组
|
||||
VM_ARRAY=(${USER_VM_ARRAY[@]} ${ROOT_VM_ARRAY[@]})
|
||||
|
||||
# 检查虚拟机数量
|
||||
if [ ${#VM_ARRAY[@]} -eq 0 ]; then
|
||||
@ -349,8 +409,37 @@ do_autostart_vm() {
|
||||
return
|
||||
fi
|
||||
|
||||
# 设置自动登录 免GUI桌面登录
|
||||
setautologin
|
||||
# 创建一个临时文件用于存储虚拟机列表
|
||||
TMP_VM_LIST=$(mktemp)
|
||||
|
||||
# 先解析 /etc/rc.local 来找出已设置为自启动的虚拟机
|
||||
AUTO_START_VMS=()
|
||||
while IFS= read -r line; do
|
||||
if [[ $line =~ VBoxHeadless\ -s\ (.+) ]]; then
|
||||
AUTO_START_VMS+=("${BASH_REMATCH[1]}")
|
||||
fi
|
||||
done </etc/rc.local
|
||||
|
||||
# 生成dialog checklist所需的格式
|
||||
for VMNAME in "${VM_ARRAY[@]}"; do
|
||||
if [[ " ${AUTO_START_VMS[@]} " =~ " ${VMNAME} " ]]; then
|
||||
STATE="on"
|
||||
else
|
||||
STATE="off"
|
||||
fi
|
||||
|
||||
if [[ " ${USER_VM_ARRAY[@]} " =~ " ${VMNAME} " ]]; then
|
||||
echo "$VMNAME byUser $STATE" >>"$TMP_VM_LIST"
|
||||
else
|
||||
echo "$VMNAME byRoot $STATE" >>"$TMP_VM_LIST"
|
||||
fi
|
||||
done
|
||||
|
||||
# 使用dialog让用户选择要自启动的虚拟机
|
||||
SELECTED_VMS=$(dialog --checklist "按 [空格键Space] 选择要自启动的虚拟机(/etc/rc.local)" 20 70 15 --file "$TMP_VM_LIST" 3>&1 1>&2 2>&3)
|
||||
|
||||
# 清除对话框
|
||||
clear
|
||||
|
||||
# 创建一个临时文件用于存储新的rc.local内容
|
||||
TMP_RC_LOCAL=$(mktemp)
|
||||
@ -359,9 +448,13 @@ do_autostart_vm() {
|
||||
echo "#!/bin/sh -e" >$TMP_RC_LOCAL
|
||||
echo "sleep 5" >>$TMP_RC_LOCAL
|
||||
|
||||
# 为每个现存的虚拟机添加启动命令
|
||||
for VMNAME in "${VM_ARRAY[@]}"; do
|
||||
# 为用户选择的每个虚拟机添加启动命令
|
||||
for VMNAME in $SELECTED_VMS; do
|
||||
if [[ " ${USER_VM_ARRAY[@]} " =~ " ${VMNAME} " ]]; then
|
||||
echo "su - $USERNAME -c \"VBoxHeadless -s $VMNAME &\"" >>$TMP_RC_LOCAL
|
||||
else
|
||||
echo "sudo VBoxHeadless -s $VMNAME &" >>$TMP_RC_LOCAL
|
||||
fi
|
||||
done
|
||||
|
||||
# 添加exit 0到临时文件的末尾
|
||||
@ -372,26 +465,12 @@ do_autostart_vm() {
|
||||
|
||||
# 删除临时文件
|
||||
rm $TMP_RC_LOCAL
|
||||
|
||||
# 创建一个临时文件用于存储虚拟机列表
|
||||
TMP_VM_LIST=$(mktemp)
|
||||
|
||||
# 将虚拟机名称写入临时文件
|
||||
for VMNAME in "${VM_ARRAY[@]}"; do
|
||||
echo "$VMNAME" >>"$TMP_VM_LIST"
|
||||
done
|
||||
|
||||
# 使用 dialog 显示虚拟机列表,并将按钮标记为“确定”
|
||||
dialog --title "下列虚拟机均已设置为开机自启动" --ok-label "确定" --textbox "$TMP_VM_LIST" 10 50
|
||||
|
||||
# 清除对话框
|
||||
clear
|
||||
|
||||
# 删除临时文件
|
||||
rm "$TMP_VM_LIST"
|
||||
|
||||
setautologin
|
||||
|
||||
# 显示/etc/rc.local的内容
|
||||
Show 0 "已将所有虚拟机设置为开机无头自启动。查看配置 /etc/rc.local,如下"
|
||||
Show 0 "已更新/etc/rc.local文件。您可以查看配置,以确认自启动虚拟机设置。"
|
||||
cat /etc/rc.local
|
||||
}
|
||||
|
||||
@ -440,41 +519,131 @@ enable_btop() {
|
||||
fi
|
||||
}
|
||||
|
||||
declare -a menu_options
|
||||
declare -A commands
|
||||
menu_options=(
|
||||
"启用SSH服务"
|
||||
"安装注音输入法(新酷音输入法)"
|
||||
"安装常用办公必备软件(office、QQ、微信、远程桌面等)"
|
||||
"安装虚拟机VirtualBox 7"
|
||||
"安装虚拟机VirtualBox 7扩展包"
|
||||
"设置虚拟机开机自启动(headless)"
|
||||
"虚拟机一键格式转换(img2vdi)"
|
||||
"准备CasaOS的使用环境"
|
||||
"安装CasaOS(包含Docker)"
|
||||
"还原配置文件os-release"
|
||||
"卸载 CasaOS"
|
||||
"配置docker为国内镜像"
|
||||
"安装btop资源监控工具"
|
||||
"卸载虚拟机"
|
||||
)
|
||||
# 检查zenity是否安装
|
||||
check_zenity_installed() {
|
||||
# 检查 zenity 是否已经安装
|
||||
if ! command -v zenity >/dev/null 2>&1; then
|
||||
echo "Zenity is not installed. Installing Zenity..."
|
||||
sudo apt-get update >/dev/null 2>&1
|
||||
sudo apt-get install zenity -y >/dev/null 2>&1
|
||||
# 再次检查是否成功安装
|
||||
if command -v zenity >/dev/null 2>&1; then
|
||||
echo "Zenity installed successfully."
|
||||
else
|
||||
echo "Failed to install Zenity."
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
echo -e
|
||||
#echo "Zenity is already installed."
|
||||
fi
|
||||
}
|
||||
|
||||
commands=(
|
||||
["启用SSH服务"]="enable_ssh"
|
||||
["安装虚拟机VirtualBox 7"]="install_virtualbox"
|
||||
["安装虚拟机VirtualBox 7扩展包"]="install_virtualbox_extpack"
|
||||
["虚拟机一键格式转换(img2vdi)"]="convert_vm_format"
|
||||
["设置虚拟机开机自启动(headless)"]="set_vm_autostart"
|
||||
["卸载虚拟机"]="uninstall_vm"
|
||||
["准备CasaOS的使用环境"]="prepare_for_casaos"
|
||||
["安装CasaOS(包含Docker)"]="install_casaos"
|
||||
["还原配置文件os-release"]="restore_os_release"
|
||||
["卸载 CasaOS"]="uninstall_casaos"
|
||||
["配置docker为国内镜像"]="configure_docker_mirror"
|
||||
["安装常用办公必备软件(office、QQ、微信、远程桌面等)"]="install_need_apps"
|
||||
["安装注音输入法(新酷音输入法)"]="install_fcitx5_chewing"
|
||||
["安装btop资源监控工具"]="enable_btop"
|
||||
)
|
||||
#硬盘直通(需root身份启动vm)
|
||||
attach_raw_disk_to_vm() {
|
||||
# 直通的硬盘,只能用于root身份启动的virtualbox
|
||||
check_zenity_installed
|
||||
|
||||
Show 3 "注意:直通的硬盘,只能用于${YELLOW}root身份启动的${NC}virtualbox,\n请选择物理硬盘索引vmdk文件保存的位置(敲回车去选择位置)${NC} [Y/n] "
|
||||
read -r -n 1 response
|
||||
echo
|
||||
case $response in
|
||||
[nN])
|
||||
echo "操作已取消。"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
vmdk_path=$(zenity --file-selection --save --confirm-overwrite --file-filter="VMDK files (vmdk) | *.vmdk" --title="Select a Path for VMDK File" 2>/dev/null)
|
||||
echo "硬盘索引保存在: $vmdk_path"
|
||||
;;
|
||||
esac
|
||||
|
||||
# 获取硬盘及其大小
|
||||
DISKS=$(lsblk -nrdo NAME,TYPE,SIZE | awk '$2=="disk" {print "/dev/"$1 " " $3}')
|
||||
|
||||
# 将硬盘信息转换为 dialog 可接受的格式
|
||||
OPTIONS=()
|
||||
for DISK in $DISKS; do
|
||||
# 分割字符串以获取设备名和大小
|
||||
IFS=' ' read -r NAME SIZE <<<"$DISK"
|
||||
OPTIONS+=("${NAME} ${SIZE}")
|
||||
done
|
||||
|
||||
# 使用 dialog 显示菜单
|
||||
device=$(dialog --clear \
|
||||
--backtitle "VirtualBox硬盘直通(软直通)" \
|
||||
--title "硬盘列表" \
|
||||
--menu "请选择一个需要直通的硬盘:" 15 50 4 \
|
||||
"${OPTIONS[@]}" \
|
||||
2>&1 >/dev/tty)
|
||||
|
||||
# 清除对话框
|
||||
clear
|
||||
# 输出用户选择
|
||||
echo "直通的硬盘是: ${device} 其中索引vmdk文件将创建在:${vmdk_path}"
|
||||
sudo VBoxManage internalcommands createrawvmdk -filename "$vmdk_path" -rawdisk $device
|
||||
|
||||
# 检查命令执行的退出状态码
|
||||
if [ $? -eq 0 ]; then
|
||||
# 检查文件是否存在
|
||||
if [ -f "$vmdk_path" ]; then
|
||||
Show 0 "恭喜您!直通的索引 VMDK 文件已成功创建在: $vmdk_path"
|
||||
sudo chmod 777 $vmdk_path
|
||||
Show 3 "请您以root身份启动虚拟机,添加直通的硬盘索引vmdk文件即可"
|
||||
Show 3 "添加之前,请检查${device} 是否处于挂载状态。若处于挂载状态,请在磁盘管理中卸载"
|
||||
else
|
||||
echo "VMDK 文件不存在。可能是由于权限问题或路径错误。"
|
||||
fi
|
||||
else
|
||||
echo "命令执行失败。"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
# 创建一个以root身份运行的Virtualbox7 图标
|
||||
create_root_vm_desktop() {
|
||||
# 指定 .desktop 文件的路径
|
||||
local desktop_file="$HOME/Desktop/VirtualBoxRoot.desktop"
|
||||
# 创建 .desktop 文件并写入内容
|
||||
cat >"$desktop_file" <<EOF
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Exec=sh -c 'pkexec env DISPLAY=\$DISPLAY XAUTHORITY=\$XAUTHORITY VirtualBox'
|
||||
Name=VirtualBox (Root)
|
||||
Icon=virtualbox
|
||||
Terminal=false
|
||||
EOF
|
||||
|
||||
chmod +x "$desktop_file"
|
||||
Show 0 "以root身份运行的Virtualbox7 图标已创建,在桌面上直接双击就可以用啦!"
|
||||
}
|
||||
|
||||
# 刷新虚拟硬盘的UUID
|
||||
# 在 VirtualBox 中,每个虚拟磁盘(VDI、VMDK 等)都有一个唯一的 UUID,有时需要重新生成这个 UUID,特别是在复制或移动虚拟磁盘文件时。
|
||||
refresh_vm_disk_uuid() {
|
||||
check_zenity_installed
|
||||
# 让用户选择虚拟磁盘文件
|
||||
local disk_path=$(zenity --file-selection --title="Select a Virtual Disk File" --file-filter="*.vmdk *.vdi" 2>/dev/null)
|
||||
|
||||
# 检查用户是否选择了文件
|
||||
if [ -z "$disk_path" ]; then
|
||||
zenity --error --text="No file selected. Operation cancelled." --width=400 --height=200 2>/dev/null
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 检查磁盘文件是否存在
|
||||
if [ ! -f "$disk_path" ]; then
|
||||
zenity --error --text="Disk file not found: $disk_path" --width=400 --height=200 2>/dev/null
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 使用 VBoxManage 命令刷新 UUID
|
||||
if VBoxManage internalcommands sethduuid "$disk_path" >/dev/null 2>&1; then
|
||||
zenity --info --text="恭喜你!虚拟硬盘UUID刷新成功了\n文件位于:$disk_path" --width=400 --height=200 2>/dev/null
|
||||
else
|
||||
zenity --error --text="Failed to refresh UUID for disk: $disk_path" --width=400 --height=200 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
show_menu() {
|
||||
clear
|
||||
@ -483,19 +652,24 @@ show_menu() {
|
||||
|
||||
echo -e "${GREEN_LINE}"
|
||||
echo '
|
||||
*********** DIY NAS 工具箱v1.1 ***************
|
||||
*********** DIY NAS 工具箱v1.2 ***************
|
||||
适配系统:deepin 20.9/v23 beta2(基于debian)
|
||||
脚本作用:快速部署一个办公场景下的Diy NAS
|
||||
|
||||
--- Made by wukong with YOU ---
|
||||
'
|
||||
echo -e " https://github.com/wukongdaily/diy-nas-onescript"
|
||||
echo -e "${GREEN_LINE}"
|
||||
echo "请选择操作:"
|
||||
|
||||
# 特殊处理的项数组
|
||||
special_items=("设置虚拟机开机自启动(headless)" "VirtualBox硬盘直通" "创建root身份的VirtualBox图标" "刷新虚拟硬盘的UUID")
|
||||
for i in "${!menu_options[@]}"; do
|
||||
if [[ "${menu_options[i]}" == "设置虚拟机开机无头自启动" ]]; then
|
||||
echo -e "$((i + 1)). ${YELLOW}${menu_options[i]}${NO_COLOR}"
|
||||
if [[ " ${special_items[*]} " =~ " ${menu_options[i]} " ]]; then
|
||||
# 如果当前项在特殊处理项数组中,使用特殊颜色
|
||||
echo -e "$((i + 1)). ${aCOLOUR[7]}${menu_options[i]}${NO_COLOR}"
|
||||
else
|
||||
# 否则,使用普通格式
|
||||
echo "$((i + 1)). ${menu_options[i]}"
|
||||
fi
|
||||
done
|
||||
@ -509,8 +683,22 @@ handle_choice() {
|
||||
return
|
||||
fi
|
||||
|
||||
if [ -z "${menu_options[$choice - 1]}" ] || [ -z "${commands[${menu_options[$choice - 1]}]}" ]; then
|
||||
echo "无效选项,请重新选择。"
|
||||
# 检查输入是否为数字
|
||||
if ! [[ $choice =~ ^[0-9]+$ ]]; then
|
||||
echo -e "${RED}请输入有效数字!${NC}"
|
||||
return
|
||||
fi
|
||||
|
||||
# 检查数字是否在有效范围内
|
||||
if [[ $choice -lt 1 ]] || [[ $choice -gt ${#menu_options[@]} ]]; then
|
||||
echo -e "${RED}选项超出范围!${NC}"
|
||||
echo -e "${YELLOW}请输入 1 到 ${#menu_options[@]} 之间的数字。${NC}"
|
||||
return
|
||||
fi
|
||||
|
||||
# 执行命令
|
||||
if [ -z "${commands[${menu_options[$choice - 1]}]}" ]; then
|
||||
echo -e "${RED}无效选项,请重新选择。${NC}"
|
||||
return
|
||||
fi
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user