core: 避免使用 eval

This commit is contained in:
bin456789
2026-06-19 10:53:30 +08:00
parent 1a76b4f4bb
commit b35751bd72
+76 -62
View File
@@ -1137,21 +1137,35 @@ get_windows_iso_link_inner() {
error_and_exit "Could not find iso for this windows edition or language." error_and_exit "Could not find iso for this windows edition or language."
} }
set_var() {
# eval 不安全
# 仅 bash 可用
printf -v "$1" "%s" "$2"
# 或者
# IFS= read -r "$1" <<<"$2"
}
setos() { setos() {
local step=$1 local step=$1
local distro=$2 local distro=$2
local releasever=$3 local releasever=$3
info set $step $distro $releasever info set $step $distro $releasever
set_osvar() {
set_var "${step}_$1" "$2"
}
setos_netboot.xyz() { setos_netboot.xyz() {
if is_efi; then if is_efi; then
if [ "$basearch" = aarch64 ]; then if [ "$basearch" = aarch64 ]; then
eval ${step}_efi=https://boot.netboot.xyz/ipxe/netboot.xyz-arm64.efi set_osvar efi https://boot.netboot.xyz/ipxe/netboot.xyz-arm64.efi
else else
eval ${step}_efi=https://boot.netboot.xyz/ipxe/netboot.xyz.efi set_osvar efi https://boot.netboot.xyz/ipxe/netboot.xyz.efi
fi fi
else else
eval ${step}_vmlinuz=https://boot.netboot.xyz/ipxe/netboot.xyz.lkrn set_osvar vmlinuz https://boot.netboot.xyz/ipxe/netboot.xyz.lkrn
fi fi
} }
@@ -1164,10 +1178,10 @@ setos() {
else else
mirror=http://dl-cdn.alpinelinux.org/alpine/v$releasever mirror=http://dl-cdn.alpinelinux.org/alpine/v$releasever
fi fi
eval ${step}_vmlinuz=$mirror/releases/$basearch/netboot/vmlinuz-$flavour set_osvar vmlinuz "$mirror/releases/$basearch/netboot/vmlinuz-$flavour"
eval ${step}_initrd=$mirror/releases/$basearch/netboot/initramfs-$flavour set_osvar initrd "$mirror/releases/$basearch/netboot/initramfs-$flavour"
eval ${step}_modloop=$mirror/releases/$basearch/netboot/modloop-$flavour set_osvar modloop "$mirror/releases/$basearch/netboot/modloop-$flavour"
eval ${step}_repo=$mirror/main set_osvar repo "$mirror/main"
} }
setos_debian() { setos_debian() {
@@ -1259,22 +1273,22 @@ Continue?
else else
ci_type=nocloud ci_type=nocloud
fi fi
eval ${step}_img=$cdimage_mirror/cloud/$codename/latest/debian-$releasever-$ci_type-$basearch_alt.qcow2 set_osvar img "$cdimage_mirror/cloud/$codename/latest/debian-$releasever-$ci_type-$basearch_alt.qcow2"
else else
# 传统安装 # 传统安装
initrd_dir=dists/$codename/main/installer-$basearch_alt/current/images/netboot/debian-installer/$basearch_alt initrd_dir=dists/$codename/main/installer-$basearch_alt/current/images/netboot/debian-installer/$basearch_alt
eval ${step}_udeb_mirror=$udeb_mirror set_osvar udeb_mirror "$udeb_mirror"
eval ${step}_vmlinuz=https://$initrd_mirror/$initrd_dir/linux set_osvar vmlinuz "https://$initrd_mirror/$initrd_dir/linux"
eval ${step}_initrd=https://$initrd_mirror/$initrd_dir/initrd.gz set_osvar initrd "https://$initrd_mirror/$initrd_dir/initrd.gz"
eval ${step}_ks=$confhome/debian.cfg set_osvar ks "$confhome/debian.cfg"
eval ${step}_firmware=$cdimage_mirror/unofficial/non-free/firmware/$codename/current/firmware.cpio.gz set_osvar firmware "$cdimage_mirror/unofficial/non-free/firmware/$codename/current/firmware.cpio.gz"
eval ${step}_codename=$codename set_osvar codename "$codename"
fi fi
# 官方安装和云镜像都会用到的 # 官方安装和云镜像都会用到的
eval ${step}_deb_mirror=$deb_mirror set_osvar deb_mirror "$deb_mirror"
eval ${step}_kernel=linux-image$flavour-$basearch_alt set_osvar kernel "linux-image$flavour-$basearch_alt"
} }
setos_kali() { setos_kali() {
@@ -1298,13 +1312,13 @@ Continue?
is_virt && flavour=-cloud || flavour= is_virt && flavour=-cloud || flavour=
eval ${step}_vmlinuz=$mirror/linux set_osvar vmlinuz "$mirror/linux"
eval ${step}_initrd=$mirror/initrd.gz set_osvar initrd "$mirror/initrd.gz"
eval ${step}_ks=$confhome/debian.cfg set_osvar ks "$confhome/debian.cfg"
eval ${step}_deb_mirror=$hostname/kali set_osvar deb_mirror "$hostname/kali"
eval ${step}_udeb_mirror=$hostname/kali set_osvar udeb_mirror "$hostname/kali"
eval ${step}_codename=$codename set_osvar codename "$codename"
eval ${step}_kernel=linux-image$flavour-$basearch_alt set_osvar kernel "linux-image$flavour-$basearch_alt"
# 缺少 firmware 下载 # 缺少 firmware 下载
fi fi
} }
@@ -1348,10 +1362,10 @@ Continue?
if ! is_have_minimal_image; then if ! is_have_minimal_image; then
error_and_exit "Minimal cloud image is not available for $releasever $basearch_alt." error_and_exit "Minimal cloud image is not available for $releasever $basearch_alt."
fi fi
eval ${step}_img="$ci_mirror/minimal/releases/$codename/release/ubuntu-$releasever-minimal-cloudimg-$basearch_img.img" set_osvar img "$ci_mirror/minimal/releases/$codename/release/ubuntu-$releasever-minimal-cloudimg-$basearch_img.img"
else else
# 用 codename 而不是 releasever,可减少一次跳转 # 用 codename 而不是 releasever,可减少一次跳转
eval ${step}_img="$ci_mirror/releases/$codename/release/ubuntu-$releasever-server-cloudimg-$basearch_img.img" set_osvar img "$ci_mirror/releases/$codename/release/ubuntu-$releasever-server-cloudimg-$basearch_img.img"
fi fi
else else
# 传统安装 # 传统安装
@@ -1373,11 +1387,11 @@ Continue?
iso=$mirror/$filename iso=$mirror/$filename
# 在 ubuntu 20.04 上,file 命令检测 ubuntu 22.04 iso 结果是 DOS/MBR boot sector # 在 ubuntu 20.04 上,file 命令检测 ubuntu 22.04 iso 结果是 DOS/MBR boot sector
test_url "$iso" iso test_url "$iso" iso
eval ${step}_iso=$iso set_osvar iso "$iso"
# ks # ks
eval ${step}_ks=$confhome/ubuntu.yaml set_osvar ks "$confhome/ubuntu.yaml"
eval ${step}_minimal=$minimal set_osvar minimal "$minimal"
fi fi
} }
@@ -1399,7 +1413,7 @@ Continue?
if is_use_cloud_image; then if is_use_cloud_image; then
# cloud image # cloud image
eval ${step}_img=$mirror/images/latest/Arch-Linux-x86_64-cloudimg.qcow2 set_osvar img "$mirror/images/latest/Arch-Linux-x86_64-cloudimg.qcow2"
else else
# 传统安装 # 传统安装
case "$basearch" in case "$basearch" in
@@ -1407,7 +1421,7 @@ Continue?
aarch64) dir="$basearch/core" ;; aarch64) dir="$basearch/core" ;;
esac esac
test_url $mirror/$dir/core.db gzip test_url $mirror/$dir/core.db gzip
eval ${step}_mirror=$mirror set_osvar mirror "$mirror"
fi fi
} }
@@ -1425,7 +1439,7 @@ Continue?
# 该服务器文件缓存 miss 时会响应 206 + Location 头 # 该服务器文件缓存 miss 时会响应 206 + Location 头
# 但 curl 这种情况不会重定向,所以添加 text 类型让它不要报错 # 但 curl 这种情况不会重定向,所以添加 text 类型让它不要报错
test_url $mirror/nixos-$releasever/store-paths.xz 'xz text' test_url $mirror/nixos-$releasever/store-paths.xz 'xz text'
eval ${step}_mirror=$mirror set_osvar mirror "$mirror"
fi fi
} }
@@ -1444,13 +1458,13 @@ Continue?
filename=$(curl -L $mirror/$dir/latest-$prefix.txt | grep '.qcow2' | awk '{print $1}' | grep .) filename=$(curl -L $mirror/$dir/latest-$prefix.txt | grep '.qcow2' | awk '{print $1}' | grep .)
file=$mirror/$dir/$filename file=$mirror/$dir/$filename
test_url "$file" 'qemu' test_url "$file" 'qemu'
eval ${step}_img=$file set_osvar img "$file"
else else
prefix=stage3-$basearch_alt-systemd prefix=stage3-$basearch_alt-systemd
filename=$(curl -L $mirror/$dir/latest-$prefix.txt | grep '.tar.xz' | awk '{print $1}' | grep .) filename=$(curl -L $mirror/$dir/latest-$prefix.txt | grep '.tar.xz' | awk '{print $1}' | grep .)
file=$mirror/$dir/$filename file=$mirror/$dir/$filename
test_url "$file" 'tar.xz' test_url "$file" 'tar.xz'
eval ${step}_img=$file set_osvar img "$file"
fi fi
} }
@@ -1494,7 +1508,7 @@ Continue?
# 有专门的kvm镜像,openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2,里面没有cloud-init # 有专门的kvm镜像,openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2,里面没有cloud-init
# file=openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2 # file=openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
fi fi
eval ${step}_img=$mirror/$dir/$file set_osvar img "$mirror/$dir/$file"
} }
setos_windows() { setos_windows() {
@@ -1567,9 +1581,9 @@ The current machine is $basearch, but it seems the ISO is for $iso_arch. Continu
[ -n "$boot_wim" ] && test_url "$boot_wim" 'wim' [ -n "$boot_wim" ] && test_url "$boot_wim" 'wim'
eval "${step}_iso='$iso'" set_osvar iso "$iso"
eval "${step}_boot_wim='$boot_wim'" set_osvar boot_wim "$boot_wim"
eval "${step}_image_name='$image_name'" set_osvar image_name "$image_name"
} }
# shellcheck disable=SC2154 # shellcheck disable=SC2154
@@ -1603,15 +1617,15 @@ Continue with DD?
继续 DD?' 继续 DD?'
read -r -p '[y/N]: ' read -r -p '[y/N]: '
if [[ "$REPLY" = [Yy] ]]; then if [[ "$REPLY" = [Yy] ]]; then
eval ${step}_confirmed_no_efi=1 set_osvar confirmed_no_efi 1
else else
exit exit
fi fi
fi fi
fi fi
eval "${step}_img='$img'" set_osvar img "$img"
eval "${step}_img_type='$img_type'" set_osvar img_type "$img_type"
eval "${step}_img_type_warp='$img_type_warp'" set_osvar img_type_warp "$img_type_warp"
} }
setos_fnos() { setos_fnos() {
@@ -1626,7 +1640,7 @@ Continue with DD?
if ! { is_digit "$input" && [ "$input" -ge "$min" ]; }; then if ! { is_digit "$input" && [ "$input" -ge "$min" ]; }; then
error "Invalid Size. Please Try again." error "Invalid Size. Please Try again."
else else
eval "${step}_fnos_part_size=${input}G" set_osvar fnos_part_size "${input}G"
break break
fi fi
done done
@@ -1652,7 +1666,7 @@ Continue with DD?
fi fi
test_url "$iso" iso test_url "$iso" iso
eval "${step}_iso='$iso'" set_osvar iso "$iso"
} }
setos_aosc() { setos_aosc() {
@@ -1668,7 +1682,7 @@ Continue with DD?
sort -uV | tail -1 | grep .) sort -uV | tail -1 | grep .)
img=$mirror/$dir/$file img=$mirror/$dir/$file
test_url $img 'tar.xz' test_url $img 'tar.xz'
eval ${step}_img=$img set_osvar img "$img"
} }
setos_centos_almalinux_rocky_fedora() { setos_centos_almalinux_rocky_fedora() {
@@ -1733,7 +1747,7 @@ Continue with DD?
;; ;;
esac esac
eval ${step}_img=${ci_image} set_osvar img "$ci_image"
else else
# 传统安装 # 传统安装
case $distro in case $distro in
@@ -1757,12 +1771,12 @@ Continue with DD?
error_and_exit "All mirror failed." error_and_exit "All mirror failed."
fi fi
eval "${step}_mirrorlist='${mirrorlist}'" set_osvar mirrorlist "$mirrorlist"
eval ${step}_ks=$confhome/redhat.cfg set_osvar ks "$confhome/redhat.cfg"
eval ${step}_vmlinuz=${mirror}images/pxeboot/vmlinuz set_osvar vmlinuz "${mirror}images/pxeboot/vmlinuz"
eval ${step}_initrd=${mirror}images/pxeboot/initrd.img set_osvar initrd "${mirror}images/pxeboot/initrd.img"
eval ${step}_squashfs=${mirror}images/install.img set_osvar squashfs "${mirror}images/install.img"
test_url ${mirror}images/install.img 'squashfs' test_url ${mirror}images/install.img 'squashfs'
fi fi
} }
@@ -1786,7 +1800,7 @@ Continue with DD?
file=$(jq -r .kvm.image $tmp/oracle.json) file=$(jq -r .kvm.image $tmp/oracle.json)
ci_image=$mirror$dir/$file ci_image=$mirror$dir/$file
eval ${step}_img=${ci_image} set_osvar img "$ci_image"
else else
: :
fi fi
@@ -1798,7 +1812,7 @@ Continue with DD?
if [ "$basearch" = x86_64 ] && [[ "$img" = *rhel-10* ]]; then if [ "$basearch" = x86_64 ] && [[ "$img" = *rhel-10* ]]; then
assert_cpu_supports_x86_64_v3 assert_cpu_supports_x86_64_v3
fi fi
eval "${step}_img='$img'" set_osvar img "$img"
else else
: :
fi fi
@@ -1823,7 +1837,7 @@ Continue with DD?
file=$(curl -L $mirror/$dir/ | grep -oP 'OpenCloudOS.*?\.qcow2' | file=$(curl -L $mirror/$dir/ | grep -oP 'OpenCloudOS.*?\.qcow2' |
sort -uV | tail -1 | grep .) sort -uV | tail -1 | grep .)
eval ${step}_img=$mirror/$dir/$file set_osvar img "$mirror/$dir/$file"
else else
: :
fi fi
@@ -1839,7 +1853,7 @@ Continue with DD?
filename='AnolisOS.*?-ANCK\.qcow2' filename='AnolisOS.*?-ANCK\.qcow2'
file=$(curl -L $mirror/$dir/ | grep -oP "$filename" | file=$(curl -L $mirror/$dir/ | grep -oP "$filename" |
sort -uV | tail -1 | grep .) sort -uV | tail -1 | grep .)
eval ${step}_img=$mirror/$dir/$file set_osvar img "$mirror/$dir/$file"
else else
: :
fi fi
@@ -1855,14 +1869,14 @@ Continue with DD?
# ci # ci
name=$(curl -L "$mirror/" | grep -oE "openEuler-$releasever(-LTS)?(-SP[0-9])?" | name=$(curl -L "$mirror/" | grep -oE "openEuler-$releasever(-LTS)?(-SP[0-9])?" |
sort -uV | tail -1 | grep .) sort -uV | tail -1 | grep .)
eval ${step}_img=$mirror/$name/virtual_machine_img/$basearch/$name-$basearch.qcow2.xz set_osvar img "$mirror/$name/virtual_machine_img/$basearch/$name-$basearch.qcow2.xz"
else else
: :
fi fi
} }
eval ${step}_distro=$distro set_osvar distro "$distro"
eval ${step}_releasever=$releasever set_osvar releasever "$releasever"
case "$distro" in case "$distro" in
centos | almalinux | rocky | fedora) setos_centos_almalinux_rocky_fedora ;; centos | almalinux | rocky | fedora) setos_centos_almalinux_rocky_fedora ;;
@@ -2787,9 +2801,9 @@ collect_netconf() {
for v in 4 6; do for v in 4 6; do
if via_gateway_dev_ethx=$(ip -$v route show default | grep -Ewo 'via [^ ]+ dev [^ ]+' | head -1 | grep .); then if via_gateway_dev_ethx=$(ip -$v route show default | grep -Ewo 'via [^ ]+ dev [^ ]+' | head -1 | grep .); then
read -r _ gateway _ ethx <<<"$via_gateway_dev_ethx" read -r _ gateway _ ethx <<<"$via_gateway_dev_ethx"
eval ipv${v}_ethx="$ethx" # can_use_cloud_kernel 要用 set_var ipv${v}_ethx "$ethx" # can_use_cloud_kernel 要用
eval ipv${v}_mac="$(ip link show dev $ethx | grep link/ether | head -1 | awk '{print $2}')" set_var ipv${v}_mac "$(ip link show dev $ethx | grep link/ether | head -1 | awk '{print $2}')"
eval ipv${v}_gateway="$gateway" set_var ipv${v}_gateway "$gateway"
# 获取所有全局地址 # 获取所有全局地址
all_addrs=$(ip -$v -o addr show scope global dev $ethx | grep -v temporary | awk '{print $4}') all_addrs=$(ip -$v -o addr show scope global dev $ethx | grep -v temporary | awk '{print $4}')
@@ -2808,9 +2822,9 @@ collect_netconf() {
fi fi
fi fi
eval ipv${v}_addr="$primary_addr" set_var ipv${v}_addr "$primary_addr"
# extra_addrs: 除主地址外的所有地址 # extra_addrs: 除主地址外的所有地址
eval ipv${v}_extra_addrs="$(echo "$all_addrs" | grep -Fxve "$primary_addr" | tr '\n' ',' | sed 's/,$//')" set_var ipv${v}_extra_addrs "$(echo "$all_addrs" | grep -Fxve "$primary_addr" | tr '\n' ',' | sed 's/,$//')"
fi fi
done done
fi fi