转载 通用无限制在 Linux VPS 上一键全自动 dd 安装 Windows 系统
作者:萌咖大佬

本教程转自萌咖大佬

官网点我访问

无限制全自动dd安装Windows

突破没有VNC,没有救援模式,内存比dd包小的限制.
使用Debian Live CD中的busybox做中间媒介,经过复杂的处理,
使本机的网络参数传进Windows操作系统中,
即使没有DHCP能够让Windows获取网络参数,
也能让Windows操作系统在开机的第一时间能够连通网络.
  • 更新:

  • [2018.04.03]
    功能合并:
    1. Debian/Ubuntu/CentOS 网络安装/重装系统/纯净安装 一键脚本
    2. [2018.03.30]
    优化GRUB检测测逻辑.
    添加组件依赖检测.
    修复一些已知BUG.
    3. [2018.03.25]
    优化判断逻辑.
    增加手动指定网络参数选项,可有效避免自动获取网络参数无效造成无法直接联网的问题.
  • 背景:

    1. 带Windows的为什么就卖得那么贵?
    2. 当然是为了更自由的使用自己的机器.
  • 需求:

    1. 与萌咖博客中的Debian(Ubuntu)网络安装/重装一键脚本需求一样.
    2. 无DHCP时额外需求: iconv
    1
    2
    3
    4
    #Debian/Ubuntu
    ## 一般自带
    #RedHat/CentOS
    yum install glibc-common
  • 限制:

    1. 需要定制dd包.
    开启内置Administrator账户登录(配置自动登陆)..
    开启远程桌面(默认3389端口).
    禁用UAC..
    适当的调整防火墙.(可选)
  • 需要相关的虚拟化驱动.

    VirtIO驱动(备份下载) XEN驱动(备份下载)
    dd包解压后的体积不能超过机器第一块硬盘的最大容积.
  • 使用方法:

    1
    wget --no-check-certificate -qO InstallNET.sh 'https://moeclub.org/attachment/LinuxShell/InstallNET.sh' && bash InstallNET.sh -dd '[Windows dd包直连地址]'
  • 萌咖提供的demo包(1.19G;已激活):

    1
    2
    3
    https://moeclub.org/get-win7embx86-auto
    # 该包只添加了VirtIO驱动,理论上仅能在KVM,Hyper-V构架下正常运行.
    # 如需在其他虚拟化构架下运行,请自行添加相关虚拟化驱动.

    使用的是Windows Embedded Standard 7(Thin PC)作为底包,官方精简.

    如需其他组件,例如:完整的桌面特征,Windows照片查看器等.

    请参考: Thin PC (Win7 Embedded) 安装组件

    • 使用示例:

      1
      2
      3
      #在你的机器上全新安装,如果你有VNC,可以看到全部过程.
      #在dd的过程中,会卡在分区的界面上,不会走进度条.完成后将会自动重启.
      wget --no-check-certificate -qO InstallNET.sh 'https://moeclub.org/attachment/LinuxShell/InstallNET.sh' && bash InstallNET.sh -dd 'https://moeclub.org/get-win7embx86-auto'
  • 使用示例(指定网络参数):

    1
    2
    3
    4
    5
    # 将X.X.X.X替换为自己的网络参数.
    # --ip-addr :IP Address/IP地址
    # --ip-mask :Netmask /子网掩码
    # --ip-gate :Gateway /网关
    # wget --no-check-certificate -qO InstallNET.sh 'https://moeclub.org/attachment/LinuxShell/InstallNET.sh' && bash InstallNET.sh --ip-addr X.X.X.X --ip-mask X.X.X.X --ip-gate X.X.X.X -dd 'https://moeclub.org/get-win7embx86-auto'

萌卡博客

  • 注意事项:

    1. 远程登陆账号为: Administrator
    2. 远程登陆密码为: Vicer
    3. 仅修改了主机名,可放心使用.(建议自己制作.)
    4. 使用的公用网盘,如需长期/大量使用此包请自行备份.
    5. 如果因此违反了TOS,萌咖不负任何责任.当然 博主也不会负责的
  • 可能用到的命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ::以管理员身份运行CMD::
    ::更改用户的密码
    net user [用户名] [密码]
    ::激活 Administrator 账户
    net user Administrator /active:yes
    ::设置 Administrator 账户密码
    net user Administrator [新密码]
    ::添加用户
    net user [用户名] [密码] /add
    ::将用户添加至 Administrator 组
    net localgroup Administrators [用户名] /add
    ::删除用户
    net user [用户名] /del
  • 温馨提示:

    在磁盘管理中,点击’C‘盘,右键选择’扩展卷‘,可以直接’增加‘C盘的空间.
    激活相关请参考: https://moeclub.org/kms
  • 萌咖提供的可用包:

    • 与本地用iso镜像安装过程一样,如果你有VNC,可看到全部过程.

      因为全新安装!!! 全新安装!!! 全新安装!!! 所以会等待久一点.
    • Windows Embedded 8.1 Industry Pro x64 (2.87G;KVM;XEN;Hyper-V;未激活)
      1
      https://moeclub.org/get-win8embx64-auto
  • 预览:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    #!/bin/bash

    export tmpVER=''
    export tmpDIST=''
    export tmpURL=''
    export tmpWORD=''
    export tmpMirror=''
    export tmpSSL=''
    export tmpINS=''
    export tmpFW=''
    export ipAddr=''
    export ipMask=''
    export ipGate=''
    export linuxdists=''
    export ddMode='0'
    export setNet='0'
    export isMirror='0'
    export FindDists='0'

    while [[ $# -ge 1 ]]; do
    case $1 in
    -v|--ver)
    shift
    tmpVER="$1"
    shift
    ;;
    -d|--debian)
    shift
    linuxdists='debian'
    tmpDIST="$1"
    shift
    ;;
    -u|--ubuntu)
    shift
    linuxdists='ubuntu'
    tmpDIST="$1"
    shift
    ;;
    -dd|--image)
    shift
    ddMode='1'
    tmpURL="$1"
    shift
    ;;
    -p|--password)
    shift
    tmpWORD="$1"
    shift
    ;;
    --ip-addr)
    shift
    ipAddr="$1"
    shift
    ;;
    --ip-mask)
    shift
    ipMask="$1"
    shift
    ;;
    --ip-gate)
    shift
    ipGate="$1"
    shift
    ;;
    -a|--auto)
    shift
    tmpINS='auto'
    ;;
    -m|--manual)
    shift
    tmpINS='manual'
    ;;
    -apt|--mirror)
    shift
    isMirror='1'
    tmpMirror="$1"
    shift
    ;;
    -ssl)
    shift
    tmpSSL="$1"
    shift
    ;;
    --firmware)
    shift
    tmpFW='1'
    ;;
    *)
    echo -ne " Usage:\n\t$0\t-d/--debian [\033[33m\033[04mdists-name\033[0m]\n\t\t\t\t-u/--ubuntu [\033[04mdists-name\033[0m]\n\t\t\t\t-v/--ver [32/\033[33m\033[04mi386\033[0m|64/amd64]\n\t\t\t\t--ip-addr/--ip-gate/--ip-mask\n\t\t\t\t-apt/--mirror\n\t\t\t\t-dd/--image\n\t\t\t\t-a/--auto\n\t\t\t\t-m/--manual\n"
    exit 1;
    ;;
    esac
    done

    [[ "$EUID" -ne '0' ]] && echo "Error:This script must be run as root!" && exit 1;

    function CheckDependence(){
    FullDependence='0';
    for BIN_DEP in `echo "$1" |sed 's/,/\n/g'`
    do
    if [[ -n "$BIN_DEP" ]]; then
    Founded='0';
    for BIN_PATH in `echo "$PATH" |sed 's/:/\n/g'`
    do
    ls $BIN_PATH/$BIN_DEP >/dev/null 2>&1;
    if [ $? == '0' ]; then
    Founded='1';
    break;
    fi
    done
    if [ "$Founded" == '1' ]; then
    echo -en "$BIN_DEP\t\t[\033[32mok\033[0m]\n";
    else
    FullDependence='1';
    echo -en "$BIN_DEP\t\t[\033[31mfail\033[0m]\n";
    fi
    fi
    done
    if [ "$FullDependence" == '1' ]; then
    exit 1;
    fi
    }

    clear && echo -e "\n\033[36m# Check Dependence\033[0m\n"
    CheckDependence wget,awk,grep,sed,cut,cat,cpio,gzip

    [ "$ddMode" == '1' ] && {
    CheckDependence iconv
    }

    [[ -f '/boot/grub/grub.cfg' ]] && GRUBOLD='0' && GRUBDIR='/boot/grub' && GRUBFILE='grub.cfg';
    [[ -z "$GRUBDIR" ]] && [[ -f '/boot/grub2/grub.cfg' ]] && GRUBOLD='0' && GRUBDIR='/boot/grub2' && GRUBFILE='grub.cfg';
    [[ -z "$GRUBDIR" ]] && [[ -f '/boot/grub/grub.conf' ]] && GRUBOLD='1' && GRUBDIR='/boot/grub' && GRUBFILE='grub.conf';
    [ -z "$GRUBDIR" -o -z "$GRUBFILE" ] && echo -ne "Error! \nNot Found grub path.\n" && exit 1;

    [[ -n "$tmpVER" ]] && {
    [ "$tmpVER" == '32' -o "$tmpVER" == 'i386' ] && VER='i386';
    [ "$tmpVER" == '64' -o "$tmpVER" == 'amd64' ] && VER='amd64';
    }
    [[ -z "$VER" ]] && VER='i386';

    [[ -z "$linuxdists" ]] && linuxdists='debian';

    [[ "$isMirror" == '1' ]] && [[ -n "$tmpMirror" ]] && {
    tmpDebianMirror="$(echo -n "$tmpMirror" |grep -Eo '.*\.(\w+)')";
    echo -n "$tmpDebianMirror" |grep -q '://';
    [[ $? -eq '0' ]] && {
    DebianMirror="$(echo -n "$tmpDebianMirror" |awk -F'://' '{print $2}')";
    } || {
    DebianMirror="$(echo -n "$tmpDebianMirror")";
    }
    } || {
    [[ "$linuxdists" == 'debian' ]] && DebianMirror='httpredir.debian.org';
    [[ "$linuxdists" == 'ubuntu' ]] && DebianMirror='archive.ubuntu.com';
    }

    [[ -z "$DebianMirrorDirectory" ]] && [[ -n "$DebianMirror" ]] && [[ -n "$tmpMirror" ]] && {
    DebianMirrorDirectory="$(echo -n "$tmpMirror" |awk -F''${DebianMirror}'' '{print $2}' |sed 's/\/$//g')";
    }

    [[ -n "$DebianMirror" ]] && {
    [[ "$DebianMirrorDirectory" == '/' ]] && {
    [[ "$linuxdists" == 'debian' ]] && DebianMirrorDirectory='/debian';
    [[ "$linuxdists" == 'ubuntu' ]] && DebianMirrorDirectory='/ubuntu';
    }
    [[ -z "$DebianMirrorDirectory" ]] && {
    [[ "$linuxdists" == 'debian' ]] && DebianMirrorDirectory='/debian';
    [[ "$linuxdists" == 'ubuntu' ]] && DebianMirrorDirectory='/ubuntu';
    }
    }

    [[ -z "$tmpDIST" ]] && {
    [[ "$linuxdists" == 'debian' ]] && DIST='wheezy';
    [[ "$linuxdists" == 'ubuntu' ]] && DIST='trusty';
    }

    [[ -z "$DIST" ]] && {
    DIST="$(echo "$tmpDIST" |sed -r 's/(.*)/\L\1/')";
    echo "$DIST" |grep -q '[0-9]';
    [[ $? -eq '0' ]] && {
    isDigital="$(echo "$DIST" |grep -o '[0-9\.]\{1,\}' |sed -n '1h;1!H;$g;s/\n//g;$p' |cut -d'.' -f1)";
    [[ -n $isDigital ]] && {
    [[ "$isDigital" == '7' ]] && DIST='wheezy';
    [[ "$isDigital" == '8' ]] && DIST='jessie';
    [[ "$isDigital" == '9' ]] && DIST='stretch';
    [[ "$isDigital" == '10' ]] && DIST='buster';
    }
    }
    }

    [[ "$ddMode" == '1' ]] && {
    [[ -n "$tmpURL" ]] && {
    linuxdists='debian';
    DIST='jessie';
    VER='amd64';
    tmpINS='auto';
    DDURL="$tmpURL"
    echo "$DDURL" |grep -q '^http://\|^ftp://\|^https://';
    [[ $? -ne '0' ]] && echo 'Please input vaild URL,Only support http://, ftp:// and https:// !' && exit 1;
    [[ -n "$tmpSSL" ]] && SSL_SUPPORT="$tmpSSL";
    [[ -z "$SSL_SUPPORT" ]] && SSL_SUPPORT='https://moeclub.org/get-wget_udeb_amd64';
    } || {
    echo 'Please input vaild URL! ';
    exit 1;
    }
    }

    DistsList="$(wget --no-check-certificate -qO- "http://$DebianMirror$DebianMirrorDirectory/dists/" |grep -o 'href=.*/"' |cut -d'"' -f2 |sed '/-\|old\|Debian\|experimental\|stable\|test\|sid\|devel/d' |grep '^[^/]' |sed -n '1h;1!H;$g;s/\n//g;s/\//\;/g;$p')";
    for CheckDEB in `echo "$DistsList" |sed 's/;/\n/g'`
    do
    [[ "$CheckDEB" == "$DIST" ]] && FindDists='1';
    [[ "$FindDists" == '1' ]] && break;
    done
    [[ "$FindDists" == '0' ]] && {
    echo -ne '\nThe dists version not found, Please check it! \n\n'
    bash $0 error;
    exit 1;
    }

    [[ -n "$tmpINS" ]] && {
    [[ "$tmpINS" == 'auto' ]] && inVNC='n';
    [[ "$tmpINS" == 'manual' ]] && inVNC='y';
    }

    [ -n "$ipAddr" ] && [ -n "$ipMask" ] && [ -n "$ipGate" ] && setNet='1';
    [[ -n "$tmpWORD" ]] && myPASSWORD="$tmpWORD";
    [[ -n "$tmpFW" ]] && INCFW="$tmpFW";
    [[ -z "$myPASSWORD" ]] && myPASSWORD='Vicer';
    [[ -z "$INCFW" ]] && INCFW='0';

    clear && echo -e "\n\033[36m# Install\033[0m\n"

    ASKVNC(){
    inVNC='y';
    [[ "$ddMode" == '0' ]] && {
    echo -ne "\033[34mCan you login VNC?\033[0m\e[33m[\e[32my\e[33m/n]\e[0m "
    read tmpinVNC
    [[ -n "$tmpinVNC" ]] && inVNCtmp="$tmpinVNC"
    }
    [ "$inVNCtmp" == 'y' -o "$inVNCtmp" == 'Y' ] && inVNC='y';
    [ "$inVNCtmp" == 'n' -o "$inVNCtmp" == 'N' ] && inVNC='n';
    }

    [ "$inVNC" == 'y' -o "$inVNC" == 'n' ] || ASKVNC;
    [[ "$linuxdists" == 'debian' ]] && LinuxName='Debian';
    [[ "$linuxdists" == 'ubuntu' ]] && LinuxName='Ubuntu';
    [[ "$ddMode" == '0' ]] && {
    [[ "$inVNC" == 'y' ]] && echo -e "\033[34mManual Mode\033[0m insatll \033[33m$LinuxName\033[0m [\033[33m$DIST\033[0m] [\033[33m$VER\033[0m] in VNC. "
    [[ "$inVNC" == 'n' ]] && echo -e "\033[34mAuto Mode\033[0m insatll \033[33m$LinuxName\033[0m [\033[33m$DIST\033[0m] [\033[33m$VER\033[0m]. "
    }
    [[ "$ddMode" == '1' ]] && {
    echo -ne "\033[34mAuto Mode\033[0m insatll \033[33mWindows\033[0m\n[\033[33m$DDURL\033[0m]\n"
    }

    echo -e "\n[\033[33m$LinuxName\033[0m] [\033[33m$DIST\033[0m] [\033[33m$VER\033[0m] Downloading..."
    [[ -z "$DebianMirror" ]] && echo -ne "\033[31mError! \033[0mGet debian mirror fail! \n" && exit 1
    [[ -z "$DebianMirrorDirectory" ]] && echo -ne "\033[31mError! \033[0mGet debian mirror directory fail! \n" && exit 1
    wget --no-check-certificate -qO '/boot/initrd.gz' "http://$DebianMirror$DebianMirrorDirectory/dists/$DIST/main/installer-$VER/current/images/netboot/$linuxdists-installer/$VER/initrd.gz"
    [[ $? -ne '0' ]] && echo -ne "\033[31mError! \033[0mDownload 'initrd.gz' failed! \n" && exit 1
    wget --no-check-certificate -qO '/boot/linux' "http://$DebianMirror$DebianMirrorDirectory/dists/$DIST/main/installer-$VER/current/images/netboot/$linuxdists-installer/$VER/linux"
    [[ $? -ne '0' ]] && echo -ne "\033[31mError! \033[0mDownload 'linux' failed! \n" && exit 1
    [[ "$INCFW" == '1' ]] && [[ "$linuxdists" == 'debian' ]] && {
    wget --no-check-certificate -qO '/boot/firmware.cpio.gz' "http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/$DIST/current/firmware.cpio.gz"
    [[ $? -ne '0' ]] && echo -ne "\033[31mError! \033[0mDownload 'firmware' failed! \n" && exit 1
    }

    [[ "$setNet" == '1' ]] && {
    IPv4="$ipAddr";
    MASK="$ipMask";
    GATE="$ipGate";
    } || {
    DEFAULTNET="$(ip route show |grep -o 'default via [0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.*' |head -n1 |sed 's/proto.*\|onlink.*//g' |awk '{print $NF}')";
    [[ -n "$DEFAULTNET" ]] && IPSUB="$(ip addr |grep ''${DEFAULTNET}'' |grep 'global' |grep 'brd' |head -n1 |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}/[0-9]\{1,2\}')";
    IPv4="$(echo -n "$IPSUB" |cut -d'/' -f1)";
    NETSUB="$(echo -n "$IPSUB" |grep -o '/[0-9]\{1,2\}')";
    GATE="$(ip route show |grep -o 'default via [0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' |head -n1 |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}')";
    [[ -n "$NETSUB" ]] && MASK="$(echo -n '128.0.0.0/1,192.0.0.0/2,224.0.0.0/3,240.0.0.0/4,248.0.0.0/5,252.0.0.0/6,254.0.0.0/7,255.0.0.0/8,255.128.0.0/9,255.192.0.0/10,255.224.0.0/11,255.240.0.0/12,255.248.0.0/13,255.252.0.0/14,255.254.0.0/15,255.255.0.0/16,255.255.128.0/17,255.255.192.0/18,255.255.224.0/19,255.255.240.0/20,255.255.248.0/21,255.255.252.0/22,255.255.254.0/23,255.255.255.0/24,255.255.255.128/25,255.255.255.192/26,255.255.255.224/27,255.255.255.240/28,255.255.255.248/29,255.255.255.252/30,255.255.255.254/31,255.255.255.255/32' |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}'${NETSUB}'' |cut -d'/' -f1)";
    }

    [[ -n "$GATE" ]] && [[ -n "$MASK" ]] && [[ -n "$IPv4" ]] || {
    echo "Not found `ip command`, It will use `route command`."
    ipNum() {
    local IFS='.';
    read ip1 ip2 ip3 ip4 <<<"$1";
    echo $((ip1*(1<<24)+ip2*(1<<16)+ip3*(1<<8)+ip4));
    }

    SelectMax(){
    ii=0;
    for IPITEM in `route -n |awk -v OUT=$1 '{print $OUT}' |grep '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}'`
    do
    NumTMP="$(ipNum $IPITEM)";
    eval "arrayNum[$ii]='$NumTMP,$IPITEM'";
    ii=$[$ii+1];
    done
    echo ${arrayNum[@]} |sed 's/\s/\n/g' |sort -n -k 1 -t ',' |tail -n1 |cut -d',' -f2;
    }

    [[ -z $IPv4 ]] && IPv4="$(ifconfig |grep 'Bcast' |head -n1 |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' |head -n1)";
    [[ -z $GATE ]] && GATE="$(SelectMax 2)";
    [[ -z $MASK ]] && MASK="$(SelectMax 3)";

    [[ -n "$GATE" ]] && [[ -n "$MASK" ]] && [[ -n "$IPv4" ]] || {
    echo "Error! Not configure network. ";
    exit 1;
    }
    }

    [[ "$setNet" != '1' ]] && [[ -f '/etc/network/interfaces' ]] && {
    [[ -z "$(sed -n '/iface.*inet static/p' /etc/network/interfaces)" ]] && AutoNet='1' || AutoNet='0';
    [[ -d /etc/network/interfaces.d ]] && {
    ICFGN="$(find /etc/network/interfaces.d -name '*.cfg' |wc -l)" || ICFGN='0';
    [[ "$ICFGN" -ne '0' ]] && {
    for NetCFG in `ls -1 /etc/network/interfaces.d/*.cfg`
    do
    [[ -z "$(cat $NetCFG | sed -n '/iface.*inet static/p')" ]] && AutoNet='1' || AutoNet='0';
    [[ "$AutoNet" -eq '0' ]] && break;
    done
    }
    }
    }

    [[ "$setNet" != '1' ]] && [[ -d '/etc/sysconfig/network-scripts' ]] && {
    ICFGN="$(find /etc/sysconfig/network-scripts -name 'ifcfg-*' |grep -v 'lo'|wc -l)" || ICFGN='0';
    [[ "$ICFGN" -ne '0' ]] && {
    for NetCFG in `ls -1 /etc/sysconfig/network-scripts/ifcfg-* |grep -v 'lo$' |grep -v ':[0-9]\{1,\}'`
    do
    [[ -n "$(cat $NetCFG | sed -n '/BOOTPROTO.*[dD][hH][cC][pP]/p')" ]] && AutoNet='1' || {
    AutoNet='0' && . $NetCFG;
    [[ -n $NETMASK ]] && MASK="$NETMASK";
    [[ -n $GATEWAY ]] && GATE="$GATEWAY";
    }
    [[ "$AutoNet" -eq '0' ]] && break;
    done
    }
    }

    [[ ! -f $GRUBDIR/$GRUBFILE ]] && echo "Error! Not Found $GRUBFILE. " && exit 1;

    [[ ! -f $GRUBDIR/$GRUBFILE.old ]] && [[ -f $GRUBDIR/$GRUBFILE.bak ]] && mv -f $GRUBDIR/$GRUBFILE.bak $GRUBDIR/$GRUBFILE.old;
    mv -f $GRUBDIR/$GRUBFILE $GRUBDIR/$GRUBFILE.bak;
    [[ -f $GRUBDIR/$GRUBFILE.old ]] && cat $GRUBDIR/$GRUBFILE.old >$GRUBDIR/$GRUBFILE || cat $GRUBDIR/$GRUBFILE.bak >$GRUBDIR/$GRUBFILE;

    [[ "$GRUBOLD" == '0' ]] && {
    READGRUB='/tmp/grub.read'
    cat $GRUBDIR/$GRUBFILE |sed -n '1h;1!H;$g;s/\n/+++/g;$p' |grep -oPm 1 'menuentry\ .*\{.*\}\+\+\+' |sed 's/\+\+\+/\n/g' >$READGRUB
    LoadNum="$(cat $READGRUB |grep -c 'menuentry ')"
    if [[ "$LoadNum" -eq '1' ]]; then
    cat $READGRUB |sed '/^$/d' >/tmp/grub.new;
    elif [[ "$LoadNum" -gt '1' ]]; then
    CFG0="$(awk '/menuentry /{print NR}' $READGRUB|head -n 1)";
    CFG2="$(awk '/menuentry /{print NR}' $READGRUB|head -n 2 |tail -n 1)";
    CFG1="";
    for tmpCFG in `awk '/}/{print NR}' $READGRUB`
    do
    [ "$tmpCFG" -gt "$CFG0" -a "$tmpCFG" -lt "$CFG2" ] && CFG1="$tmpCFG";
    done
    [[ -z "$CFG1" ]] && {
    echo "Error! read $GRUBFILE. ";
    exit 1;
    }

    sed -n "$CFG0,$CFG1"p $READGRUB >/tmp/grub.new;
    [[ -f /tmp/grub.new ]] && [[ "$(grep -c '{' /tmp/grub.new)" -eq "$(grep -c '}' /tmp/grub.new)" ]] || {
    echo -ne "\033[31mError! \033[0mNot configure $GRUBFILE. \n";
    exit 1;
    }
    fi
    [ ! -f /tmp/grub.new ] && echo "Error! $GRUBFILE. " && exit 1;
    sed -i "/menuentry.*/c\menuentry\ \'Install OS \[$DIST\ $VER\]\'\ --class debian\ --class\ gnu-linux\ --class\ gnu\ --class\ os\ \{" /tmp/grub.new
    sed -i "/echo.*Loading/d" /tmp/grub.new;
    }

    [[ "$GRUBOLD" == '1' ]] && {
    CFG0="$(awk '/title /{print NR}' $GRUBDIR/$GRUBFILE|head -n 1)";
    CFG1="$(awk '/title /{print NR}' $GRUBDIR/$GRUBFILE|head -n 2 |tail -n 1)";
    [[ -n $CFG0 ]] && [ -z $CFG1 -o $CFG1 == $CFG0 ] && sed -n "$CFG0,$"p $GRUBDIR/$GRUBFILE >/tmp/grub.new;
    [[ -n $CFG0 ]] && [ -z $CFG1 -o $CFG1 != $CFG0 ] && sed -n "$CFG0,$CFG1"p $GRUBDIR/$GRUBFILE >/tmp/grub.new;
    [[ ! -f /tmp/grub.new ]] && echo "Error! configure append $GRUBFILE. " && exit 1;
    sed -i "/title.*/c\title\ \'Install OS \[$DIST\ $VER\]\'" /tmp/grub.new;
    sed -i '/^#/d' /tmp/grub.new;
    }

    [[ -n "$(grep 'linux.*/\|kernel.*/' /tmp/grub.new |awk '{print $2}' |tail -n 1 |grep '^/boot/')" ]] && Type='InBoot' || Type='NoBoot';

    LinuxKernel="$(grep 'linux.*/\|kernel.*/' /tmp/grub.new |awk '{print $1}' |head -n 1)";
    [[ -z "$LinuxKernel" ]] && echo "Error! read grub config! " && exit 1;
    LinuxIMG="$(grep 'initrd.*/' /tmp/grub.new |awk '{print $1}' |tail -n 1)";
    [ -z "$LinuxIMG" ] && sed -i "/$LinuxKernel.*\//a\\\tinitrd\ \/" /tmp/grub.new && LinuxIMG='initrd';

    [[ "$Type" == 'InBoot' ]] && {
    sed -i "/$LinuxKernel.*\//c\\\t$LinuxKernel\\t\/boot\/linux auto=true hostname=$linuxdists domain= -- quiet" /tmp/grub.new;
    sed -i "/$LinuxIMG.*\//c\\\t$LinuxIMG\\t\/boot\/initrd.gz" /tmp/grub.new;
    }

    [[ "$Type" == 'NoBoot' ]] && {
    sed -i "/$LinuxKernel.*\//c\\\t$LinuxKernel\\t\/linux auto=true hostname=$linuxdists domain= -- quiet" /tmp/grub.new;
    sed -i "/$LinuxIMG.*\//c\\\t$LinuxIMG\\t\/initrd.gz" /tmp/grub.new;
    }

    sed -i '$a\\n' /tmp/grub.new;

    [[ "$inVNC" == 'n' ]] && {
    GRUBPATCH='0';

    [ -f '/etc/network/interfaces' -o -d '/etc/sysconfig/network-scripts' ] || {
    echo "Error, Not found interfaces config.";
    exit 1;
    }

    INSERTGRUB="$(awk '/menuentry /{print NR}' $GRUBDIR/$GRUBFILE|head -n 1)"
    sed -i ''${INSERTGRUB}'i\\n' $GRUBDIR/$GRUBFILE;
    sed -i ''${INSERTGRUB}'r /tmp/grub.new' $GRUBDIR/$GRUBFILE;
    [[ -f $GRUBDIR/grubenv ]] && sed -i 's/saved_entry/#saved_entry/g' $GRUBDIR/grubenv;

    [[ -d /boot/tmp ]] && rm -rf /boot/tmp;
    mkdir -p /boot/tmp;
    cd /boot/tmp;
    gzip -d < ../initrd.gz | cpio --extract --verbose --make-directories --no-absolute-filenames >>/dev/null 2>&1

    cat >/boot/tmp/preseed.cfg<<EOF
    d-i debian-installer/locale string en_US
    d-i console-setup/layoutcode string us

    d-i keyboard-configuration/xkb-keymap string us

    d-i netcfg/choose_interface select auto

    d-i netcfg/disable_autoconfig boolean true
    d-i netcfg/dhcp_failed note
    d-i netcfg/dhcp_options select Configure network manually
    d-i netcfg/get_ipaddress string $IPv4
    d-i netcfg/get_netmask string $MASK
    d-i netcfg/get_gateway string $GATE
    d-i netcfg/get_nameservers string 8.8.8.8
    d-i netcfg/no_default_route boolean true
    d-i netcfg/confirm_static boolean true

    d-i hw-detect/load_firmware boolean true

    d-i mirror/country string manual
    d-i mirror/http/hostname string $DebianMirror
    d-i mirror/http/directory string $DebianMirrorDirectory
    d-i mirror/http/proxy string

    d-i passwd/root-login boolean ture
    d-i passwd/make-user boolean false
    d-i passwd/root-password password $myPASSWORD
    d-i passwd/root-password-again password $myPASSWORD
    d-i user-setup/allow-password-weak boolean true
    d-i user-setup/encrypt-home boolean false

    d-i clock-setup/utc boolean true
    d-i time/zone string US/Eastern
    d-i clock-setup/ntp boolean true

    d-i preseed/early_command string anna-install libfuse2-udeb fuse-udeb ntfs-3g-udeb fuse-modules-3.16.0-4-amd64-di
    d-i partman/early_command string \
    debconf-set partman-auto/disk "\$(list-devices disk |head -n1)"; \
    wget -qO- '$DDURL' |gunzip -dc |/bin/dd of=\$(list-devices disk |head -n1); \
    mount.ntfs-3g \$(list-devices partition |head -n1) /mnt; \
    cd '/mnt/ProgramData/Microsoft/Windows/Start Menu/Programs'; \
    cd Start* || cd start*; \
    cp -f '/net.bat' './net.bat'; \
    /sbin/reboot; \
    debconf-set grub-installer/bootdev string "\$(list-devices disk |head -n1)"; \
    umount /media || true; \

    d-i partman/mount_style select uuid
    d-i partman-auto/init_automatically_partition select Guided - use entire disk
    d-i partman-auto/method string regular
    d-i partman-lvm/device_remove_lvm boolean true
    d-i partman-md/device_remove_md boolean true
    d-i partman-auto/choose_recipe select atomic
    d-i partman-partitioning/confirm_write_new_label boolean true
    d-i partman/choose_partition select finish
    d-i partman-lvm/confirm boolean true
    d-i partman-lvm/confirm_nooverwrite boolean true
    d-i partman/confirm boolean true
    d-i partman/confirm_nooverwrite boolean true

    d-i debian-installer/allow_unauthenticated boolean true

    tasksel tasksel/first multiselect minimal
    d-i pkgsel/update-policy select none
    d-i pkgsel/include string openssh-server
    d-i pkgsel/upgrade select none

    popularity-contest popularity-contest/participate boolean false

    d-i grub-installer/only_debian boolean true
    d-i grub-installer/bootdev string default
    d-i finish-install/reboot_in_progress note
    d-i debian-installer/exit/reboot boolean true
    d-i preseed/late_command string \
    sed -ri 's/^#?PermitRootLogin.*/PermitRootLogin yes/g' /target/etc/ssh/sshd_config; \
    sed -ri 's/^#?PasswordAuthentication.*/PasswordAuthentication yes/g' /target/etc/ssh/sshd_config;
    EOF

    [[ "$setNet" == '0' ]] && [[ "$AutoNet" == '1' ]] && {
    sed -i '/netcfg\/disable_autoconfig/d' /boot/tmp/preseed.cfg
    sed -i '/netcfg\/dhcp_options/d' /boot/tmp/preseed.cfg
    sed -i '/netcfg\/get_.*/d' /boot/tmp/preseed.cfg
    sed -i '/netcfg\/confirm_static/d' /boot/tmp/preseed.cfg
    }

    [[ "$DIST" == 'trusty' ]] && GRUBPATCH='1'
    [[ "$DIST" == 'wily' ]] && GRUBPATCH='1'

    [[ "$GRUBPATCH" == '1' ]] && {
    sed -i 's/^d-i\ grub-installer\/bootdev\ string\ default//g' /boot/tmp/preseed.cfg
    }
    [[ "$GRUBPATCH" == '0' ]] && {
    sed -i 's/debconf-set\ grub-installer\/bootdev.*\"\;//g' /boot/tmp/preseed.cfg
    }
    [[ "$DIST" == 'xenial' ]] && {
    sed -i 's/^d-i\ clock-setup\/ntp\ boolean\ true/d-i\ clock-setup\/ntp\ boolean\ false/g' /boot/tmp/preseed.cfg
    }

    [[ "$linuxdists" == 'debian' ]] && {
    sed -i '/user-setup\/allow-password-weak/d' /boot/tmp/preseed.cfg
    sed -i '/user-setup\/encrypt-home/d' /boot/tmp/preseed.cfg
    sed -i '/pkgsel\/update-policy/d' /boot/tmp/preseed.cfg
    sed -i 's/umount\ \/media.*true\;\ //g' /boot/tmp/preseed.cfg
    }

    [[ "$ddMode" == '1' ]] && {
    WinDHCP(){
    echo -ne "@ECHO OFF\r\ncd\040\057d\040\042\045ProgramData\045\057Microsoft\057Windows\057Start\040Menu\057Programs\057Startup\042\r\ndel\040\057f\040\057q\040net\056bat\r\n\r\n" >'/boot/tmp/net.tmp';
    }
    WinNoDHCP(){
    echo -ne "@ECHO OFF\r\ncd\056\076\045windir\045\GetAdmin\r\nif\040exist\040\045windir\045\GetAdmin\040\050del\040\057f\040\057q\040\042\045windir\045\GetAdmin\042\051\040else\040\050\r\necho\040CreateObject^\050\042Shell\056Application\042^\051\056ShellExecute\040\042\045~s0\042\054\040\042\045\052\042\054\040\042\042\054\040\042runas\042\054\040\061\040\076\076\040\042\045temp\045\Admin\056vbs\042\r\n\042\045temp\045\Admin\056vbs\042\r\ndel\040\057f\040\057q\040\042\045temp\045\Admin\056vbs\042\r\nexit\040\057b\040\062\051\r\nfor\040\057f\040\042tokens=\063\052\042\040\045\045i\040in\040\050\047netsh\040interface\040show\040interface\040^|more\040+3\040^|findstr\040\057R\040\042\u672c\u5730\056\052\040\u4ee5\u592a\056\052\040Local\056\052\040Ethernet\042\047\051\040do\040\050set\040EthName=\045\045j\051\r\nnetsh\040-c\040interface\040ip\040set\040address\040name=\042\045EthName\045\042\040source=static\040address=$IPv4\040mask=$MASK\040gateway=$GATE\r\nnetsh\040-c\040interface\040ip\040add\040dnsservers\040name=\042\045EthName\045\042\040address=\070\056\070\056\070\056\070\040index=1\040validate=no\r\nnetsh\040-c\040interface\040ip\040add\040dnsservers\040name=\042\045EthName\045\042\040address=\070\056\070\056\064\056\064\040index=2\040validate=no\r\ncd\040\057d\040\042\045ProgramData\045\057Microsoft\057Windows\057Start\040Menu\057Programs\057Startup\042\r\ndel\040\057f\040\057q\040net\056bat\r\n\r\n" >'/boot/tmp/net.tmp';
    }
    [[ "$setNet" == '1' ]] && WinNoDHCP;
    [[ "$setNet" == '0' ]] && {
    [[ "$AutoNet" -eq '1' ]] && WinDHCP;
    [[ "$AutoNet" -eq '0' ]] && WinNoDHCP;
    }
    iconv -f 'UTF-8' -t 'GBK' '/boot/tmp/net.tmp' -o '/boot/tmp/net.bat'
    rm -rf '/boot/tmp/net.tmp'
    echo "$DDURL" |grep -q '^https://'
    [[ $? -eq '0' ]] && {
    echo -ne '\nAdd ssl support...\n'
    [[ -n $SSL_SUPPORT ]] && {
    wget --no-check-certificate -qO- "$SSL_SUPPORT" |tar -x
    [[ ! -f /boot/tmp/usr/bin/wget ]] && echo 'Error! SSL_SUPPORT.' && exit 1;
    sed -i 's/wget\ -qO-/\/usr\/bin\/wget\ --no-check-certificate\ --retry-connrefused\ --tries=7\ --continue\ -qO-/g' /boot/tmp/preseed.cfg
    [[ $? -eq '0' ]] && echo -ne 'Success! \n\n'
    } || {
    echo -ne 'Not ssl support package! \n\n';
    exit 1;
    }
    }
    }

    [[ "$ddMode" == '0' ]] && {
    sed -i '/anna-install/d' /boot/tmp/preseed.cfg
    sed -i 's/wget.*\/sbin\/reboot\;\ //g' /boot/tmp/preseed.cfg
    }
    [[ "$INCFW" == '1' ]] && [[ "$linuxdists" == 'debian' ]] && [[ -f '/boot/firmware.cpio.gz' ]] && {
    gzip -d < ../firmware.cpio.gz | cpio --extract --verbose --make-directories --no-absolute-filenames >>/dev/null 2>&1
    }
    rm -rf ../initrd.gz;
    find . | cpio -H newc --create --verbose | gzip -9 > ../initrd.gz;
    rm -rf /boot/tmp;
    }

    [[ "$inVNC" == 'y' ]] && {
    sed -i '$i\\n' $GRUBDIR/$GRUBFILE
    sed -i '$r /tmp/grub.new' $GRUBDIR/$GRUBFILE
    echo -e "\n\033[33m\033[04mIt will reboot! \nPlease look at VNC! \nSelect\033[0m\033[32m Install OS [$DIST $VER] \033[33m\033[4mto install system.\033[04m\n\n\033[31m\033[04mThere is some information for you.\nDO NOT CLOSE THE WINDOW! \033[0m\n"
    echo -e "\033[35mIPv4\t\tNETMASK\t\tGATEWAY\033[0m"
    echo -e "\033[36m\033[04m$IPv4\033[0m\t\033[36m\033[04m$MASK\033[0m\t\033[36m\033[04m$GATE\033[0m\n\n"

    read -n 1 -p "Press Enter to reboot..." INP
    [[ "$INP" != '' ]] && echo -ne '\b \n\n';
    }

    chown root:root $GRUBDIR/$GRUBFILE
    chmod 444 $GRUBDIR/$GRUBFILE

    sleep 3 && reboot >/dev/null 2>&1

本教程转自萌咖大佬

官网点我访问