一、程序介绍
程序是由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
}