一、程序介绍

     程序是由golang(1.18.2版)编写,可在windows系统下运行,实现配置ip、掩码、网关、dns的功能。

二、程序价值

    在项目现场或维修环境,需手动配置及修改ip,可通过本程序,实现一个窗口解决问题。

三、程序使用的注意事项

3.1、win7环境下,网卡名称需是英文。否则会提示“找不到元素”;

3.2、“显示所有网卡信息”、“仅显示网卡名称、序号、ip&mac”,只会显示程序第一次运行时,所有网卡信息。后面手动修改ip或DNS,前面两处信息无法自动更新。

3.3、程序未做“输入判断”,需输入数字,你输入符号,程序也不会提示。

3.4、import ..encoding/simplifiedchinese,需要使用者自己去github下载。

四、程序使用方法

4.1、go编译后,执行.exe文件,即可使用。

4.2、 测试:go run main.go。

五、程序主页展示

 六、源代码

package main

import (

    "bufio"

    "fmt"

    "os"

    "os/exec"

    "strings"

    "time"

    "golang.org/x/text/encoding/simplifiedchinese"

)

type NicInfo struct {

    //网卡信息字段

    IpconfigAll []string //全部信息

    Number      int      //网卡序号

    Name        string   //网卡名字

    Ip          string   //网卡ip

    Mask        string   //网卡掩码

    GetWay      string   //网卡网关

    DNS         []string //网关DNS

    Gwmetric    string   //跳数

}

type Process struct {

    RequestName string //返回网卡名称

}

type Charset string

const (

    UTF8    = Charset("UTF-8")

    GB18030 = Charset("GB18030")

)

//init接收全部网卡信息

var showAll []string

func init() {

    //初始化,即获得全部网络信息

    params := []string{"/all"}

    command("ipconfig", params)

}

func main() {

    var key int

    p := Process{}

    //1 主页菜单

    for {

        fmt.Println("-------------网卡信息显示及设置系统-------------")

        fmt.Println("-------------1.显示所有网卡信息")

        fmt.Println("-------------2.仅显示网卡名称、序号、ip&mac")

        fmt.Println("-------------3.网卡配置ip地址")

        fmt.Println("-------------4.网卡配置DNS地址")

        fmt.Println("-------------5.网卡配置为DHCP模式")

        fmt.Println("-------------6.退出")

        fmt.Println("请输入:")

        fmt.Scanln(&key)

        //1.1 判断输入

        switch key {

        case 1:

            fmt.Println("main case1")

            p.Process(key)

        case 2:

            p.Process(key)

        case 3:

            p.Process(key)

        case 4:

            p.Process(key)

        case 5:

            p.Process(key)

        case 6:

            fmt.Println("退出")

            os.Exit(0)

        }

    }

}

func (p *Process) Process(key int) {

    n := NicInfo{}

    n.DNS = make([]string, 2)

    n.IpconfigAll = showAll

    //记录用户输入的网卡序号

    // var number int

    //1.1 判断输入

    switch key {

    case 1:

        fmt.Println("Process case1")

        for _, v := range n.IpconfigAll {

            fmt.Println(v)

        }

    case 2:

        n.showIpMaskGW()

    case 3:

        fmt.Println("输入网卡序号,请核对网卡名称:")

        fmt.Scanln(&n.Number)

        fmt.Println("网卡名称:", showAll[n.Number])

        fmt.Println("若网卡名称不对,输入0(退出),输入1(继续)")

        fmt.Scanln(&key)

        if key == 0 {

            break

        }

        fmt.Println("请输入ip")

        fmt.Scanln(&n.Ip)

        fmt.Println("请输入mask")

        fmt.Scanln(&n.Mask)

        fmt.Println("请输入getway,无=回车")

        fmt.Scanln(&n.GetWay)

        fmt.Println("请输入gwmetric,无=回车,或输入auto")

        fmt.Scanln(&n.Gwmetric)

        // 调用设置ip函数

        n.setIpMaskGW()

    case 4:

        fmt.Println("输入网卡序号,请核对网卡名称:")

        fmt.Scanln(&n.Number)

        fmt.Println("网卡名称:", n.IpconfigAll[n.Number])

        fmt.Println("若网卡名称不对,输入0(退出),输入1(继续)")

        fmt.Scanln(&key)

        if key == 0 {

            break

        }

        fmt.Println("请输入主DNS")

        fmt.Scanln(&n.DNS[0])

        fmt.Println("请输入备DNS")

        fmt.Scanln(&n.DNS[1])

        n.setDNS()

    case 5:

        fmt.Println("输入网卡序号,请核对网卡名称:")

        fmt.Scanln(&n.Number)

        fmt.Println("网卡名称:", n.IpconfigAll[n.Number])

        fmt.Println("若网卡名称不对,输入0(返回),输入1(继续)")

        fmt.Scanln(&key)

        if key == 0 {

            break

        }

        n.setDHCP()

        time.Sleep(time.Second * 2)

        fmt.Println("网卡已设置为DHCP模式")

    }

}

func (p *Process) requestNicName(number int) {

    fmt.Println("process number =", number)

    //利用unicode码点特点,把网卡名称存入nicName切片

    nicNameSlice := make([]rune, 64)

    //number就是 showAll切片的 index

    //把输入的网卡序号,从切片导入新切片

    for _, v := range showAll[number] {

        nicNameSlice = append(nicNameSlice, v)

    }

    //记录空格在一行字符串中的下标

    //左边的

    var lowNumb int

    //右边

    var maxNumb int

    for i, v := range nicNameSlice {

        //22120是unicode转ASCII的值,对应中文未器,58对应符号为:

        if v == 22120 {

            //因为器后面是空格,才是网卡名称,所以+1,就跳过空格

            lowNumb = i + 1

        } else if v == 58 {

            //网卡名称是:结尾,所以记录:的下标

            maxNumb = i

        }

    }

    //在头和尾加上双引号,就得到完整的网卡名称,因在cmd设置ip命令中,网卡名称需要""包裹

    //34是unicode转ASCII的值,对应"

    nicNameSlice[lowNumb] = 34

    nicNameSlice[maxNumb] = 34

    //+1 是[:max]大1个,就可显示nicName[maxNumb] = 34 成功

    p.RequestName = string(nicNameSlice[lowNumb : maxNumb+1])

    fmt.Println("requseNicName :", p.RequestName)

}

//cmd输入执行函数

func (p *Process) winCmd(s string) {

    cmd := exec.Command("cmd", "/C", s)

    stdout, err := cmd.StdoutPipe()

    if err != nil {

        fmt.Println(err)

        return

    }

    cmd.Run()

    in := bufio.NewScanner(stdout)

    for in.Scan() {

        cmdRe := ConvertByte2String(in.Bytes(), "GB18030")

        fmt.Println(cmdRe)

    }

    cmd.Wait()

}

//查看网卡ip/mask/gw/dns

func (n *NicInfo) showIpMaskGW() {

    //遍历所有网卡信息

    for k, v := range n.IpconfigAll {

        //判断是否包含 "适配器",含说明该行字符串有网卡名称

        if strings.Contains(v, "适配器") {

            //再排除掉蓝牙设备

            if !strings.Contains(v, "蓝牙") {

                fmt.Println("网卡序号:", k, v)

            }

            //再看有没有包含物理地址和ipv4,就是ip和mac

        } else if strings.Contains(v, "物理地址") || strings.Contains(v, "IPv4 地址") {

            fmt.Println("\n", v)

        }

    }

}

//设置网卡ip/mask/gw

func (n *NicInfo) setIpMaskGW() {

    p := &Process{}

    //返回用户需要设置的网卡名称

    p.requestNicName(n.Number)

    newSetIpMask := make([]string, 1)

    //netsh interface ip set address "eth0" static 192.168.0.12 255.255.255.0 192.168.0.254 1

    newSetIpMask[0] = "netsh interface ip set address " +

        p.RequestName + " static " + n.Ip + " " + n.Mask + " " + n.GetWay + " " + n.Gwmetric

    //支持cmd命令

    p.winCmd(newSetIpMask[0])

}

//设置网卡DNS

func (n *NicInfo) setDNS() {

    p := &Process{}

    //返回用户需要设置的网卡名称

    p.requestNicName(n.Number)

    //主DNS netsh interface ip set dns "eth0" static 218.2.135.1 primary

    //辅助D NSnetsh interface ip add dns "eh0" 223.5.5.5

    newDns := make([]string, 2)

    for {

        //设置主dns

        //==""因为主菜单,备可不输入,有个空

        if len(n.DNS) == 2 && n.DNS[1] == "" {

            fmt.Printf("~~len=%v,len1=%v,len2=%v", len(n.DNS), n.DNS[0], n.DNS[1])

            fmt.Println("len=", len(n.DNS))

            newDns[0] = "netsh interface ip set dns " +

                p.RequestName + " static " + n.DNS[0]

            fmt.Println(newDns[0])

            break

            //设置主备

        } else {

            fmt.Printf("len=%v,len1=%v,len2=%v", len(n.DNS), n.DNS[0], n.DNS[1])

            newDns[0] = "netsh interface ip set dns " +

                p.RequestName + " static " + n.DNS[0] + " primary"

            newDns[1] = "netsh interface ip add dns " +

                p.RequestName + n.DNS[1]

            fmt.Println(newDns[0], "\n", newDns[1])

            break

        }

    }

    //调用cmd输入

    for {

        if len(newDns) == 2 && newDns[1] == "" {

            fmt.Println("newDns len=1", newDns[0])

            p.winCmd(newDns[0])

            break

        } else {

            fmt.Println("newDns len=2", n.DNS[0], n.DNS[1])

            p.winCmd(newDns[0])

            time.Sleep(time.Second * 2)

            p.winCmd(newDns[1])

            break

        }

    }

}

//设置为DHCP模式

func (n *NicInfo) setDHCP() {

    //返回用户需要设置的网卡名称

    p := &Process{}

    p.requestNicName(n.Number)

    // netsh interface ip set address "本地连接" dhcp

    // netsh interface ip set dns "本地连接" dhcp

    newDHCP := make([]string, 2)

    newDHCP[0] = "netsh interface ip set address " + p.RequestName + " dhcp"

    newDHCP[1] = "netsh interface ip set dns " + p.RequestName + " dhcp"

    //调用cmd输入

    p.winCmd(newDHCP[0])

    time.Sleep(time.Second * 2)

    p.winCmd(newDHCP[1])

}

//执行init时ipconfig/all的输入及中文乱码问题

func command(command string, params []string) {

    // params := []string{"127.0.0.1", "-t"}

    fmt.Println(command, params)

    cmd := exec.Command(command, params...)

    stdout, err := cmd.StdoutPipe()

    if err != nil {

        fmt.Println(err)

        return

    }

    cmd.Start()

    in := bufio.NewScanner(stdout)

    for in.Scan() {

        cmdRe := ConvertByte2String(in.Bytes(), "GB18030")

        //把初始化的comm函数会把ipconfig/all结果,添加到n.IpconfigAll

        showAll = append(showAll, cmdRe)

    }

    cmd.Wait()

}

func ConvertByte2String(byte []byte, charset Charset) string {

    var str string

    switch charset {

    case GB18030:

        var decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(byte)

        str = string(decodeBytes)

    case UTF8:

        fallthrough

    default:

        str = string(byte)

    }

    return str

}