该脚本在 MoeClub 与 hiCasper 的脚本基础上优化,实现了一键网络重装 CentOS / Debian / Ubuntu 系统及DD方式安装系统。解决了云服务商提供模板镜像体积过大、预装软件过多、不够纯净等问题。
使用方法
#下载 wget http://mirror.apad.pro/autoreinstall/AutoReinstall.sh #执行 bash AutoReinstall.sh #重装后 #CentOS7密码为Pwd@CentOS #其它系统密码为Pwd@Linux #请修改密码 sudo passwd
支持重装的系统
CentOS 7.7 (DD Image) CentOS 7.6 (ServerSpeeder Avaliable) CentOS 6 Debian 9 Debian 10 Ubuntu 16.04 Ubuntu 18.04 Custom image (自定义DD镜像)
系统说明
·自动获取IP地址、网关、子网掩码 ·自动判断网络环境,选择国内/外镜像,解决速度慢的问题 ·脚本代码开源,无安全隐患 ·CentOS 7 镜像抛弃LVM,回归ext4,减少不稳定因素 ·OpenVZ / LXC 架构系统不适用
脚本源码
#!/bin/sh if [[ $EUID -ne 0 ]]; then clear echo "Error: This script must be run as root!" 1>&2 exit 1 fi function CopyRight() { clear echo "########################################################" echo "# #" echo "# Auto Reinstall Script #" echo "# #" echo "# Last Modified: 2020-06-01 #" echo "# #" echo "# Powered by Apad.pro #" echo "# Supported by MoeClub and hiCasper #" echo "# #" echo "########################################################" echo -e "\n" } function isValidIp() { local ip=$1 local ret=1 if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then ip=(${ip//\./ }) [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] ret=$? fi return $ret } function ipCheck() { isLegal=0 for add in $MAINIP $GATEWAYIP $NETMASK; do isValidIp $add if [ $? -eq 1 ]; then isLegal=1 fi done return $isLegal } function GetIp() { MAINIP=$(ip route get 1 | awk -F 'src ' '{print $2}' | awk '{print $1}') GATEWAYIP=$(ip route | grep default | awk '{print $3}' | head -1) SUBNET=$(ip -o -f inet addr show | awk '/scope global/{sub(/[^.]+\//,"0/",$4);print $4}' | head -1 | awk -F '/' '{print $2}') value=$(( 0xffffffff ^ ((1 << (32 - $SUBNET)) - 1) )) NETMASK="$(( (value >> 24) & 0xff )).$(( (value >> 16) & 0xff )).$(( (value >> 8) & 0xff )).$(( value & 0xff ))" } function UpdateIp() { read -r -p "Your IP: " MAINIP read -r -p "Your Gateway: " GATEWAYIP read -r -p "Your Netmask: " NETMASK } function SetNetwork() { isAuto='0' if [[ -f '/etc/network/interfaces' ]];then [[ ! -z "$(sed -n '/iface.*inet static/p' /etc/network/interfaces)" ]] && isAuto='1' [[ -d /etc/network/interfaces.d ]] && { cfgNum="$(find /etc/network/interfaces.d -name '*.cfg' |wc -l)" || cfgNum='0' [[ "$cfgNum" -ne '0' ]] && { for netConfig in `ls -1 /etc/network/interfaces.d/*.cfg` do [[ ! -z "$(cat $netConfig | sed -n '/iface.*inet static/p')" ]] && isAuto='1' done } } fi if [[ -d '/etc/sysconfig/network-scripts' ]];then cfgNum="$(find /etc/network/interfaces.d -name '*.cfg' |wc -l)" || cfgNum='0' [[ "$cfgNum" -ne '0' ]] && { for netConfig in `ls -1 /etc/sysconfig/network-scripts/ifcfg-* | grep -v 'lo$' | grep -v ':[0-9]\{1,\}'` do [[ ! -z "$(cat $netConfig | sed -n '/BOOTPROTO.*[sS][tT][aA][tT][iI][cC]/p')" ]] && isAuto='1' done } fi } function NetMode() { CopyRight if [ "$isAuto" == '0' ]; then read -r -p "Using DHCP to configure network automatically? [Y/n]:" input case $input in [yY][eE][sS]|[yY]) NETSTR='' ;; [nN][oO]|[nN]) isAuto='1' ;; *) clear; echo "Canceled by user!"; exit 1;; esac fi if [ "$isAuto" == '1' ]; then GetIp ipCheck if [ $? -ne 0 ]; then echo -e "Error occurred when detecting ip. Please input manually.\n" UpdateIp else CopyRight echo "IP: $MAINIP" echo "Gateway: $GATEWAYIP" echo "Netmask: $NETMASK" echo -e "\n" read -r -p "Confirm? [Y/n]:" input case $input in [yY][eE][sS]|[yY]) ;; [nN][oO]|[nN]) echo -e "\n" UpdateIp ipCheck [[ $? -ne 0 ]] && { clear echo -e "Input error!\n" exit 1 } ;; *) clear; echo "Canceled by user!"; exit 1;; esac fi NETSTR="--ip-addr ${MAINIP} --ip-gate ${GATEWAYIP} --ip-mask ${NETMASK}" fi } function Start() { CopyRight isCN='0' geoip=$(wget --no-check-certificate -qO- https://api.ip.sb/geoip -T 10 | grep "\"country_code\":\"CN\"") if [[ "$geoip" != "" ]];then isCN='1' fi if [ "$isAuto" == '0' ]; then echo "Using DHCP mode." else echo "IP: $MAINIP" echo "Gateway: $GATEWAYIP" echo "Netmask: $NETMASK" fi [[ "$isCN" == '1' ]] && echo "Using domestic mode." if [ -f "/tmp/InstallNET.sh" ]; then rm -f /tmp/InstallNET.sh fi wget --no-check-certificate -qO /tmp/InstallNET.sh 'http://mirror.apad.pro/autoreinstall/InstallNET.sh' && chmod a+x /tmp/InstallNET.sh CMIRROR='' CVMIRROR='' DMIRROR='' UMIRROR='' if [[ "$isCN" == '1' ]];then sed -i 's#https://github.com/MoeClub/MoeClub.github.io/raw/master/lib/wget_udeb_amd64.tar.gz#http://mirror.apad.pro/autoreinstall/wget_udeb_amd64.tar.gz#' /tmp/InstallNET.sh CMIRROR="--mirror http://mirrors.aliyun.com/centos/" CVMIRROR="--mirror http://mirrors.tuna.tsinghua.edu.cn/centos-vault/" DMIRROR="--mirror http://mirrors.aliyun.com/debian/" UMIRROR="--mirror http://mirrors.aliyun.com/ubuntu/" fi sed -i 's/$1$4BJZaD0A$y1QykUnJ6mXprENfwpseH0/$1$7R4IuxQb$J8gcq7u9K0fNSsDNFEfr90/' /tmp/InstallNET.sh sed -i '/force-efi-extra-removable/d' /tmp/InstallNET.sh echo -e "\nPlease select an OS:" echo " 1) CentOS 7.7 (DD Image)" echo " 2) CentOS 7.6 (ServerSpeeder Avaliable)" echo " 3) CentOS 6" echo " 4) Debian 9" echo " 5) Debian 10" echo " 6) Ubuntu 16.04" echo " 7) Ubuntu 18.04" echo " 8) Custom image" echo " 0) Exit" echo -ne "\nYour option: " read N case $N in 1) echo -e "\nPassword: \n"; read -s -n1 -p "Press any key to continue..." ; bash /tmp/InstallNET.sh $NETSTR -dd 'http://mirror.apad.pro/autoreinstall/CentOS-7.img.gz' $DMIRROR ;; 2) echo -e "\nPassword: Pwd@CentOS\n"; read -s -n1 -p "Press any key to continue..." ; bash /tmp/InstallNET.sh $NETSTR -dd 'http://mirror.apad.pro/autoreinstall/CentOS-76.img.gz' $DMIRROR ;; 3) echo -e "\nPassword: Pwd@Linux\n"; read -s -n1 -p "Press any key to continue..." ; bash /tmp/InstallNET.sh -c 6.10 -v 64 -a $NETSTR $CMIRROR ;; 4) echo -e "\nPassword: Pwd@Linux\n"; read -s -n1 -p "Press any key to continue..." ; bash /tmp/InstallNET.sh -d 9 -v 64 -a $NETSTR $DMIRROR ;; 5) echo -e "\nPassword: Pwd@Linux\n"; read -s -n1 -p "Press any key to continue..." ; bash /tmp/InstallNET.sh -d 10 -v 64 -a $NETSTR $DMIRROR ;; 6) echo -e "\nPassword: Pwd@Linux\n"; read -s -n1 -p "Press any key to continue..." ; bash /tmp/InstallNET.sh -u 16.04 -v 64 -a $NETSTR $UMIRROR ;; 7) echo -e "\nPassword: Pwd@Linux\n"; read -s -n1 -p "Press any key to continue..." ; bash /tmp/InstallNET.sh -u 18.04 -v 64 -a $NETSTR $UMIRROR ;; 8) echo -e "\n" read -r -p "Custom image URL: " imgURL echo -e "\n" read -r -p "Are you sure start reinstall? [Y/n]: " input case $input in [yY][eE][sS]|[yY]) bash /tmp/InstallNET.sh $NETSTR -dd $imgURL $DMIRROR ;; *) clear; echo "Canceled by user!"; exit 1;; esac ;; 0) exit 0;; *) echo "Wrong input!"; exit 1;; esac } SetNetwork NetMode Start
(注:脚本中使用的 mirror.apad.pro 为个人自建的镜像加速链接)