1717# PORT_RANGE_SIZE 每台额外端口数量 默认: 26
1818# EXTRA_PORT_START 额外端口起始值 默认: 35000
1919# SYSTEM 操作系统 默认: ubuntu
20- # AUTO_YES=y 跳过所有确认提示
20+ # noninteractive=true 跳过所有确认提示,未提供的参数使用默认值
21+ # AUTO_YES=y 兼容旧版写法,同 noninteractive=true
2122#
2223# 示例:
2324# VM_COUNT=3 CPU=2 MEMORY_GB=2 DISK_GB=20 PASSWORD=MyPass123 \
2425# SSH_START_PORT=25000 PORT_RANGE_SIZE=26 EXTRA_PORT_START=35000 \
25- # SYSTEM=debian AUTO_YES=y bash create_vm.sh
26+ # SYSTEM=debian noninteractive=true bash create_vm.sh
2627#
2728# =====================================================================
2829
@@ -53,25 +54,77 @@ check_onevm_script() {
5354 ONEVM_SCRIPT=" ./onevm.sh"
5455 else
5556 _info " 正在下载 onevm.sh..."
56- curl -sSL -o /tmp/onevm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/onevm.sh
57+ if ! curl -fsSL -o /tmp/onevm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/onevm.sh; then
58+ _error " 下载 onevm.sh 失败,请检查网络连接"
59+ fi
5760 chmod +x /tmp/onevm.sh
5861 ONEVM_SCRIPT=" /tmp/onevm.sh"
5962 fi
6063 _info " 使用脚本:$ONEVM_SCRIPT "
6164}
6265
63- # ===== 是否处于无交互模式(所有参数均由环境变量提供)=====
66+ # ===== 无交互模式判断 =====
67+ _is_truthy () {
68+ case " $( printf ' %s' " ${1:- } " | tr ' [:upper:]' ' [:lower:]' ) " in
69+ 1|true|yes|y|on) return 0 ;;
70+ * ) return 1 ;;
71+ esac
72+ }
73+
6474_is_noninteractive () {
65- [ " ${AUTO_YES} " = " y" ] || \
75+ _is_truthy " ${noninteractive:- } " || \
76+ _is_truthy " ${NONINTERACTIVE:- } " || \
77+ _is_truthy " ${AUTO_YES:- } " || \
78+ _is_truthy " ${FORCE_YES:- } " || \
6679 ( [ -n " ${VM_COUNT+x} " ] && [ -n " ${VM_PREFIX+x} " ] && \
6780 [ -n " ${CPU+x} " ] && [ -n " ${MEMORY_GB+x} " ] && \
6881 [ -n " ${DISK_GB+x} " ] && [ -n " ${PASSWORD+x} " ] && \
6982 [ -n " ${SSH_START_PORT+x} " ] && [ -n " ${SYSTEM+x} " ] )
7083}
7184
85+ _validate_uint_range () {
86+ local name=" $1 " value=" $2 " min=" $3 " max=" $4 "
87+ if ! [[ " $value " =~ ^[0-9]+$ ]] || [ " $value " -lt " $min " ] || [ " $value " -gt " $max " ]; then
88+ _error " ${name} 无效:${value} (必须在 ${min} -${max} 范围内)"
89+ fi
90+ }
91+
92+ _ranges_overlap () {
93+ local start_a=" $1 " end_a=" $2 " start_b=" $3 " end_b=" $4 "
94+ [ " $start_a " -le " $end_b " ] && [ " $start_b " -le " $end_a " ]
95+ }
96+
97+ validate_params () {
98+ _validate_uint_range " 虚拟机数量" " $VM_COUNT " 1 9999
99+ _validate_uint_range " 起始编号" " $START_NUM " 0 999999
100+ _validate_uint_range " CPU 核数" " $CPU " 1 256
101+ _validate_uint_range " 内存" " $MEMORY_GB " 1 1048576
102+ _validate_uint_range " 磁盘" " $DISK_GB " 1 1048576
103+ _validate_uint_range " SSH 起始端口" " $SSH_START_PORT " 1 65535
104+ _validate_uint_range " 额外端口范围大小" " $PORT_RANGE_SIZE " 0 65535
105+
106+ local ssh_end=$(( SSH_START_PORT + VM_COUNT - 1 ))
107+ if [ " $ssh_end " -gt 65535 ]; then
108+ _error " SSH 端口范围越界:${SSH_START_PORT} -${ssh_end} "
109+ fi
110+
111+ if [ " $PORT_RANGE_SIZE " -gt 0 ]; then
112+ _validate_uint_range " 额外端口起始值" " $EXTRA_PORT_START " 1 65535
113+ local extra_end=$(( EXTRA_PORT_START + VM_COUNT * PORT_RANGE_SIZE - 1 ))
114+ if [ " $extra_end " -gt 65535 ]; then
115+ _error " 额外端口范围越界:${EXTRA_PORT_START} -${extra_end} "
116+ fi
117+ if _ranges_overlap " $SSH_START_PORT " " $ssh_end " " $EXTRA_PORT_START " " $extra_end " ; then
118+ _error " SSH 端口范围 ${SSH_START_PORT} -${ssh_end} 与额外端口范围 ${EXTRA_PORT_START} -${extra_end} 重叠"
119+ fi
120+ else
121+ EXTRA_PORT_START=" ${EXTRA_PORT_START:- 0} "
122+ fi
123+ }
124+
72125# ===== 交互式参数收集(若环境变量已设置则使用环境变量,跳过 read)=====
73126collect_params () {
74- # 若 AUTO_YES=y 且所有必要变量已设置,无需打印菜单
127+ # 无交互模式下无需打印菜单
75128 if ! _is_noninteractive; then
76129 echo " "
77130 echo " ======================================================"
@@ -81,7 +134,7 @@ collect_params() {
81134 fi
82135
83136 # ----- 数量 -----
84- if [ -z " ${VM_COUNT+x} " ]; then
137+ if [ -z " ${VM_COUNT+x} " ] && ! _is_noninteractive ; then
85138 read -rp " 请输入虚拟机数量 [默认: 1]: " VM_COUNT
86139 fi
87140 VM_COUNT=" ${VM_COUNT:- 1} "
@@ -90,7 +143,7 @@ collect_params() {
90143 fi
91144
92145 # ----- 名称前缀 -----
93- if [ -z " ${VM_PREFIX+x} " ]; then
146+ if [ -z " ${VM_PREFIX+x} " ] && ! _is_noninteractive ; then
94147 read -rp " 请输入虚拟机名称前缀 [默认: vm]: " VM_PREFIX
95148 fi
96149 VM_PREFIX=" ${VM_PREFIX:- vm} "
@@ -99,31 +152,31 @@ collect_params() {
99152 fi
100153
101154 # ----- 起始编号 -----
102- if [ -z " ${START_NUM+x} " ]; then
155+ if [ -z " ${START_NUM+x} " ] && ! _is_noninteractive ; then
103156 read -rp " 请输入起始编号 [默认: 1]: " START_NUM
104157 fi
105158 START_NUM=" ${START_NUM:- 1} "
106159
107160 # ----- CPU -----
108- if [ -z " ${CPU+x} " ]; then
161+ if [ -z " ${CPU+x} " ] && ! _is_noninteractive ; then
109162 read -rp " 请输入每台虚拟机 CPU 核数 [默认: 1]: " CPU
110163 fi
111164 CPU=" ${CPU:- 1} "
112165
113166 # ----- 内存 -----
114- if [ -z " ${MEMORY_GB+x} " ]; then
167+ if [ -z " ${MEMORY_GB+x} " ] && ! _is_noninteractive ; then
115168 read -rp " 请输入每台虚拟机内存(GB)[默认: 1]: " MEMORY_GB
116169 fi
117170 MEMORY_GB=" ${MEMORY_GB:- 1} "
118171
119172 # ----- 磁盘 -----
120- if [ -z " ${DISK_GB+x} " ]; then
173+ if [ -z " ${DISK_GB+x} " ] && ! _is_noninteractive ; then
121174 read -rp " 请输入每台虚拟机磁盘大小(GB)[默认: 10]: " DISK_GB
122175 fi
123176 DISK_GB=" ${DISK_GB:- 10} "
124177
125178 # ----- 密码 -----
126- if [ -z " ${PASSWORD+x} " ]; then
179+ if [ -z " ${PASSWORD+x} " ] && ! _is_noninteractive ; then
127180 read -rp " 请输入 root 密码 [默认: 随机生成]: " PASSWORD
128181 fi
129182 if [ -z " $PASSWORD " ]; then
@@ -133,27 +186,28 @@ collect_params() {
133186 fi
134187
135188 # ----- SSH 起始端口 -----
136- if [ -z " ${SSH_START_PORT+x} " ]; then
189+ if [ -z " ${SSH_START_PORT+x} " ] && ! _is_noninteractive ; then
137190 read -rp " 请输入 SSH 起始端口 [默认: 25000]: " SSH_START_PORT
138191 fi
139192 SSH_START_PORT=" ${SSH_START_PORT:- 25000} "
140193
141194 # ----- 额外端口范围大小 -----
142- if [ -z " ${PORT_RANGE_SIZE+x} " ]; then
195+ if [ -z " ${PORT_RANGE_SIZE+x} " ] && ! _is_noninteractive ; then
143196 read -rp " 请输入每台 VM 的额外端口范围大小(0=不分配)[默认: 26]: " PORT_RANGE_SIZE
144197 fi
145198 PORT_RANGE_SIZE=" ${PORT_RANGE_SIZE:- 26} "
199+ _validate_uint_range " 额外端口范围大小" " $PORT_RANGE_SIZE " 0 65535
146200
147201 # ----- 额外端口起始值 -----
148202 if [ " $PORT_RANGE_SIZE " -gt 0 ]; then
149- if [ -z " ${EXTRA_PORT_START+x} " ]; then
203+ if [ -z " ${EXTRA_PORT_START+x} " ] && ! _is_noninteractive ; then
150204 read -rp " 请输入额外端口起始值 [默认: 35000]: " EXTRA_PORT_START
151205 fi
152206 EXTRA_PORT_START=" ${EXTRA_PORT_START:- 35000} "
153207 fi
154208
155209 # ----- 操作系统 -----
156- if [ -z " ${SYSTEM+x} " ]; then
210+ if [ -z " ${SYSTEM+x} " ] && ! _is_noninteractive ; then
157211 echo " "
158212 echo " 可选操作系统:"
159213 echo " 1) ubuntu - Ubuntu 22.04 LTS"
@@ -165,12 +219,13 @@ collect_params() {
165219 echo " 7) centos8-stream - CentOS Stream 8"
166220 echo " 8) centos-stream - CentOS Stream 9"
167221 echo " 9) opensuse - openSUSE Leap 15.5"
222+ echo " 10) ubuntu24 - Ubuntu 24.04 LTS"
168223 echo " "
169224 echo " 镜像优先从 oneclickvirt/pve_kvm_images 和 oneclickvirt/kvm_images 获取"
170225 read -rp " 请选择系统编号或输入系统名称 [默认: 1/ubuntu]: " SYSTEM_INPUT
171226 SYSTEM_INPUT=" ${SYSTEM_INPUT:- 1} "
172227 else
173- SYSTEM_INPUT=" ${SYSTEM} "
228+ SYSTEM_INPUT=" ${SYSTEM:- ubuntu } "
174229 fi
175230
176231 case " $SYSTEM_INPUT " in
@@ -183,9 +238,12 @@ collect_params() {
183238 7|centos8-stream|centos8) SYSTEM=" centos8-stream" ;;
184239 8|centos-stream|centos9) SYSTEM=" centos-stream" ;;
185240 9|opensuse) SYSTEM=" opensuse" ;;
241+ 10|ubuntu24|ubuntu2404) SYSTEM=" ubuntu24" ;;
186242 * ) _error " 无效的系统选择:$SYSTEM_INPUT " ;;
187243 esac
188244
245+ validate_params
246+
189247 # ----- 配置预览 -----
190248 echo " "
191249 echo " ======================================================"
@@ -205,7 +263,7 @@ collect_params() {
205263 echo " "
206264
207265 # ----- 最终确认 -----
208- if [ " ${AUTO_YES} " != " y " ] ; then
266+ if ! _is_noninteractive ; then
209267 read -rp " 确认创建?(y/n): " CONFIRM
210268 if [ " $CONFIRM " != " y" ] && [ " $CONFIRM " != " Y" ]; then
211269 _info " 已取消"
@@ -222,13 +280,13 @@ check_disk_space() {
222280
223281 if [ " $available_gb " -lt " $required_gb " ]; then
224282 _warn " 可用磁盘空间 ${available_gb} GB 可能不足(需要约 ${required_gb} GB)"
225- if [ " ${AUTO_YES} " != " y " ] ; then
283+ if ! _is_noninteractive ; then
226284 read -rp " 是否继续?(y/n): " cont
227285 if [ " $cont " != " y" ] && [ " $cont " != " Y" ]; then
228286 exit 0
229287 fi
230288 else
231- _warn " AUTO_YES=y ,忽略磁盘空间警告,继续执行..."
289+ _warn " noninteractive=true ,忽略磁盘空间警告,继续执行..."
232290 fi
233291 fi
234292}
0 commit comments