├── cmd ├── nbping └── nbping.exe ├── doc ├── tp.png └── wx.png ├── ip.txt ├── .gitignore ├── README.MD ├── nbping.go └── LICENSE /cmd/nbping: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feiyu563/nbping/HEAD/cmd/nbping -------------------------------------------------------------------------------- /doc/tp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feiyu563/nbping/HEAD/doc/tp.png -------------------------------------------------------------------------------- /doc/wx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feiyu563/nbping/HEAD/doc/wx.png -------------------------------------------------------------------------------- /cmd/nbping.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feiyu563/nbping/HEAD/cmd/nbping.exe -------------------------------------------------------------------------------- /ip.txt: -------------------------------------------------------------------------------- 1 | 172.16.208.105 2 | 172.16.208.106 3 | 4 | 5 | 10.201.2.144 6 | 7 | 10.201.2.145 8 | 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | 3 | # Test binary, build with `go test -c` 4 | *.test 5 | 6 | # Output of the go coverage tool, specifically when used with LiteIDE 7 | *.out 8 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | nbping 简介 2 | ----------------- 3 | 4 | nbping是为解决局域网大批量IP实例或主机探活,采用go协程并发处理,可以自定义并发的协程数量和输出结果.效率远高于现有的批量ping工具. 5 | 6 | -------------------------------------- 7 | 8 | nbping具备如下特性 9 | --------------------- 10 | - 支持结果导出到文件 11 | - 支持高并发,默认开启20个协程进行处理 12 | - 支持指定文件批量读取探活IP 13 | - 支持自动过滤无效IP,空行等 14 | 15 | -------------------------------------- 16 | 部署方式 17 | ---- 18 | 19 | nbping可以部署在本地和云平台上,支持windows、linux系统: 20 | 21 | - 在linux系统中部署 22 | ``` 23 | git clone https://github.com/feiyu563/nbping.git 24 | cd nbping/cmd 25 | ./nbping -i ip.txt -o out.csv #如需后台运行请执行nohup ./nbping -i ip.txt -o out.csv & 26 | ``` 27 | - 在windows系统中运行 28 | ``` 29 | git clone https://github.com/feiyu563/nbping.git 30 | #打开windows cmd窗口 31 | cd nbping/cmd 32 | nbping.exe -i ip.txt -o out.csv 33 | ``` 34 | 35 | 36 | 配置说明 37 | ---- 38 | -------------------------------------- 39 | 40 | nbping 支持以下参数: 41 | 42 | ``` 43 | -d int 44 | 是否打开debug模式,即开启显示每条IP结果记录 45 | -h 显示此帮助页 46 | build by zhangjikun@haima.me 47 | version 1.1 48 | -i string 49 | IP文件所在路径,,默认读取当前目录ip.txt (default "ip.txt") 50 | -n int 51 | 开启的并发协程数量,默认20 (default 20) 52 | -o string 53 | 结果输出文件所在路径,默认放在当前目录out.csv (default "out.csv") 54 | -r int 55 | IP检测失败重试次数,默认2次 (default 2) 56 | -t int 57 | 检测超时时间(单位秒),默认1秒 58 | ``` 59 | 60 | 效果图 61 | ---- 62 | ![tp](doc/tp.png) 63 | 64 | 65 | 项目源码 66 | ---- 67 | 68 | - [nbping][1] 69 | 70 | 71 | [1]: https://github.com/feiyu563/nbping 72 | 73 | FOR HELP 74 | ---- 75 | Email: 244217140@qq.com 76 | 77 | ![me](doc/wx.png) 78 | -------------------------------------------------------------------------------- /nbping.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "errors" 6 | "flag" 7 | "fmt" 8 | "golang.org/x/net/icmp" 9 | "golang.org/x/net/ipv4" 10 | "io/ioutil" 11 | "math/rand" 12 | "net" 13 | "os" 14 | "strings" 15 | "time" 16 | ) 17 | 18 | func Lookup(host string) (string, error) { 19 | addrs, err := net.LookupHost(host) 20 | if err != nil { 21 | return "", err 22 | } 23 | if len(addrs) < 1 { 24 | return "", errors.New("unknown host") 25 | } 26 | rd := rand.New(rand.NewSource(time.Now().UnixNano())) 27 | return addrs[rd.Intn(len(addrs))], nil 28 | } 29 | 30 | var Data = []byte("abcdefghijklmnopqrstuvwabcdefghi") 31 | 32 | type Reply struct { 33 | Time int64 34 | TTL uint8 35 | Error error 36 | } 37 | var ( 38 | Pingerr int 39 | Pingok int 40 | debug_req int 41 | retry int 42 | TimeOut int 43 | ) 44 | //多线程 45 | func IPpingStart(line string,req chan []string,status chan int) { 46 | ping, err := Run(line, 8, Data) 47 | if err != nil { 48 | fmt.Println(err) 49 | return 50 | } 51 | defer ping.Close() 52 | respones:=ping.Ping(1) 53 | if respones!="is alive" { 54 | for r:=0;r<=retry;r++ { 55 | respones=ping.Ping(1) 56 | } 57 | } 58 | 59 | if debug_req==1 { 60 | fmt.Println(line+" "+respones) 61 | } 62 | <-status 63 | req<- []string{line,respones} 64 | } 65 | //读文件 66 | func main() { 67 | Pingerr=0 68 | Pingok=0 69 | //命令行参数 70 | var ipfile string 71 | flag.StringVar(&ipfile, "i", "ip.txt", "IP文件所在路径,,默认读取当前目录ip.txt") 72 | var output string 73 | flag.StringVar(&output, "o", "out.csv", "结果输出文件所在路径,默认放在当前目录out.csv") 74 | var num int 75 | flag.IntVar(&num, "n", 20, "开启的并发协程数量,默认20") 76 | flag.IntVar(&debug_req, "d", 0, "是否打开debug模式,即开启显示每条IP结果记录") 77 | flag.IntVar(&retry, "r", 2, "IP检测失败重试次数,默认2次") 78 | flag.IntVar(&TimeOut, "t", 1, "检测超时时间(单位秒),默认1秒") 79 | var help bool 80 | flag.BoolVar(&help,"h", false, "显示此帮助页\nbuild by zhangjikun@haima.me\nversion 1.0") 81 | flag.Parse() 82 | if help { 83 | flag.Usage() 84 | return 85 | } 86 | t:=time.Now() //取当前时间戳 87 | status := make(chan int, num) 88 | req:=make(chan []string) 89 | fmt.Println("正在加载IP资源文件....") 90 | f, err := os.Open(ipfile) 91 | if err != nil { 92 | panic(err) 93 | } 94 | defer f.Close() 95 | rd := bufio.NewReader(f) 96 | LinsNum:=CountFileLine(ipfile) 97 | ips:=[]string{} 98 | 99 | for lines:=0;lines<=LinsNum;lines++ { 100 | line, _ := rd.ReadString('\n') //以'\n'为结束符读入一行 101 | line = strings.TrimSpace(line) 102 | if len(line)>5 && len(strings.Split(line, "."))==4 { 103 | ips=append(ips,line) 104 | } 105 | } 106 | LinsNum=len(ips) 107 | fmt.Println("IP资源加载完成,正在启动协程...") 108 | for _,ip:=range ips{ 109 | status <- 1 110 | go IPpingStart(ip,req,status) 111 | } 112 | strings_req:=[]string{"ip","status"} 113 | fd,_:=os.OpenFile(output,os.O_RDWR|os.O_CREATE,0644) 114 | title:=[]byte(strings_req[0]+","+strings_req[1]+"\n") 115 | fd.Write(title) 116 | for i:=0;i