Compare commits

..

65 Commits

Author SHA1 Message Date
zhshch2002
1dddd43e67 fix: 错误默认端口号造成无法TCP Trace 2022-05-27 10:38:17 +08:00
tsosunchia
4148d0d4b1 Merge pull request #18 from tsosunchia/main
修改部分提示
2022-05-27 10:37:03 +08:00
tsosunchia
4f7977da8f 修改部分提示 2022-05-27 10:36:34 +08:00
zhshch2002
cfc8034cb4 update: 允许参数后置 2022-05-27 10:26:32 +08:00
tsosunchia
dbc0f87847 Merge pull request #17 from tsosunchia/main
修改部分提示内容
2022-05-27 10:20:57 +08:00
tsosunchia
74a320898f Merge remote-tracking branch 'refs/remotes/origin/main' 2022-05-27 10:19:40 +08:00
tsosunchia
329b3fdd6b 修改部分提示内容 2022-05-27 10:19:25 +08:00
tsosunchia
3fb88f4cf4 Merge branch 'xgadget-lab:main' into main 2022-05-27 10:12:59 +08:00
tsosunchia
1de84cac71 修改部分提示内容 2022-05-27 10:12:14 +08:00
sjlleo
83d093f5aa fix: 修复一个 report 奔溃的问题 2022-05-27 10:08:28 +08:00
sjlleo
8b03ca7a38 update mod 2022-05-27 09:58:23 +08:00
tsosunchia
7a847bf0d5 Merge pull request #16 from tsosunchia/main
update README.md 增加说明
2022-05-27 09:43:28 +08:00
tsosunchia
11fe41611c update README.md 增加说明 2022-05-27 09:43:09 +08:00
tsosunchia
71b24fb7a0 Update README.md 2022-05-27 00:45:27 +08:00
tsosunchia
0b08e4b4a4 Merge pull request #15 from tsosunchia/main
update quicklytest.sh 增加部分模式下的Route-Path打印
2022-05-26 23:31:35 +08:00
tsosunchia
2608c05da1 Update quicklytest.sh 2022-05-26 23:24:03 +08:00
tsosunchia
314bdd0cce Update quicklytest.sh
启用-report
2022-05-26 23:07:14 +08:00
tsosunchia
ea958059c6 Merge branch 'main' into main 2022-05-26 23:02:49 +08:00
tsosunchia
b59c349264 Update README.md 2022-05-26 22:55:21 +08:00
tsosunchia
030a487526 Update README.md 2022-05-26 22:45:48 +08:00
tsosunchia
cac6d33fde Update quicklytest.sh 2022-05-26 22:38:14 +08:00
tsosunchia
1725a65827 Update nt_install.sh 2022-05-26 22:38:01 +08:00
tsosunchia
4d886066a3 Update quicklytest.sh 2022-05-26 22:35:25 +08:00
tsosunchia
156043730d Update nt_install.sh 2022-05-26 22:17:40 +08:00
tsosunchia
91ad3bc539 Update nt_install.sh 2022-05-26 22:03:01 +08:00
tsosunchia
351da5f5a3 Update nt_install.sh 2022-05-26 21:57:42 +08:00
tsosunchia
f8fc90d7a5 Update quicklytest.sh 2022-05-26 21:50:15 +08:00
tsosunchia
9c75635acc Update nt_install.sh 2022-05-26 21:31:14 +08:00
sjlleo
b20b27fd20 update: 现在TCP SYN模式下也将打印路由跟踪结果 2022-05-26 21:29:17 +08:00
tsosunchia
cfc1dfdfe5 Update nt_install.sh
增加检查脚本更新功能
2022-05-26 21:28:12 +08:00
tsosunchia
97c4387af4 Update quicklytest.sh 2022-05-26 21:25:17 +08:00
tsosunchia
37b5202126 Update README.md 2022-05-26 21:08:39 +08:00
tsosunchia
afb6a3e1df Update quicklytest.sh
增加自动检测更新功能
2022-05-26 21:02:19 +08:00
tsosunchia
c9a3916cd0 Update quicklytest.sh 2022-05-26 20:58:05 +08:00
tsosunchia
89d56c437e Update quicklytest.sh 2022-05-26 20:43:06 +08:00
tsosunchia
6299dcd9a3 Update quicklytest.sh 2022-05-26 20:40:06 +08:00
tsosunchia
82f28a13f3 Update quicklytest.sh 2022-05-26 20:39:26 +08:00
tsosunchia
af732bc212 Update quicklytest.sh
增加脚本提示
2022-05-26 19:55:58 +08:00
tsosunchia
8d5f58bf15 Update quicklytest.sh 2022-05-26 19:46:54 +08:00
tsosunchia
8bd5654474 Update quicklytest.sh
增加TCP,UDP模式选项
2022-05-26 19:41:57 +08:00
tsosunchia
4de61823ee Update nt_install.sh
整理排版
2022-05-26 17:36:44 +08:00
tsosunchia
39ec016d0d Update nt_install.sh
重构结构
2022-05-26 17:30:09 +08:00
tsosunchia
67999411af fix some bugs 2022-05-25 23:52:14 +08:00
tsosunchia
7cc6b71727 fix some bugs 2022-05-25 23:40:13 +08:00
tsosunchia
16ba835537 Merge pull request #14 from tsosunchia/main
update quicklytest.sh some bugs fix
2022-05-25 18:50:09 +08:00
tsosunchia
1b7c3b8d0d update quicklytest.sh some bugs fix 2022-05-25 18:49:43 +08:00
tsosunchia
bd47935a2d Merge pull request #13 from tsosunchia/main
增删一些测试节点
2022-05-25 18:35:05 +08:00
tsosunchia
1f16001e4f 增删一些测试节点 2022-05-25 18:34:29 +08:00
sjlleo
f56e6cdba3 update: 整理排版 2022-05-25 18:15:26 +08:00
tsosunchia
ecd3df8ee8 Update quicklytest.sh
替换部分已不可使用的测试节点
2022-05-25 18:11:19 +08:00
zhshch2002
1658da1653 update: README.md img tag alt 2022-05-25 18:05:04 +08:00
zhshch2002
5110c9b990 fix: README.md typo 2022-05-25 18:04:13 +08:00
zhshch2002
aa446574f1 update: README.md screenshot.png 2022-05-25 18:02:47 +08:00
tsosunchia
2016990629 Update README.md 2022-05-25 17:50:17 +08:00
tsosunchia
e639b7b12d Merge pull request #11 from tsosunchia/main
update README.md 增加对quicklytest.sh的说明
2022-05-25 17:46:23 +08:00
tsosunchia
3cfe6598dd update README.md 增加对quicklytest.sh的说明 2022-05-25 17:45:56 +08:00
tsosunchia
59193cae47 Merge pull request #10 from tsosunchia/main
Some bugs fix
2022-05-25 17:30:40 +08:00
tsosunchia
1def15e805 some bugs fix 2022-05-25 17:30:13 +08:00
tsosunchia
1950032371 Merge branch 'xgadget-lab:main' into main 2022-05-25 17:25:58 +08:00
sjlleo
f81a0b3da3 update: 当 ip.sb 触发 cloudflare 5s 墙的时候 自动退出 2022-05-25 17:25:26 +08:00
tsosunchia
9e3d4186a1 Merge pull request #1 from xgadget-lab/main
add quicklytest.sh
2022-05-25 17:24:50 +08:00
tsosunchia
4737669436 add quicklytest.sh 修改自https://github.com/KANIKIG/worst_testrace 一个快速的脚本测试你的服务器到中国的路由 2022-05-25 17:22:40 +08:00
sjlleo
dbecfd880d update: 风控IP会直接退出,避免没有数据 2022-05-25 17:19:54 +08:00
tsosunchia
a67a4bc559 Update nt_install.sh 2022-05-25 17:08:56 +08:00
tsosunchia
077d72d5cd Update nt_install.sh 2022-05-25 17:03:35 +08:00
10 changed files with 482 additions and 271 deletions

View File

@@ -1,6 +1,6 @@
<div align="center">
<img src="asset/logo.png" height="200px"/>
<img src="asset/logo.png" height="200px" alt="NextTrace Logo"/>
</div>
@@ -10,10 +10,24 @@
## How To Use
### Install
### Automated Install
```bash
curl -Ls https://raw.githubusercontent.com/xgadget-lab/nexttrace/main/nt_install.sh -O && sudo bash nt_install.sh
#下载nt_install.sh
curl -Ls https://github.com/xgadget-lab/nexttrace/raw/main/nt_install.sh -O
#执行nt_install.sh
sudo bash nt_install.sh
```
### Alternative methods
如果你的目的只是为了快速测试服务器的到中国内地的线路,没有手动使用 NextTrace 的需求,那么建议你直接使用本仓库的 `quicklytest.sh`
```bash
#下载quicklytest.sh
curl -Ls https://github.com/xgadget-lab/nexttrace/raw/main/quicklytest.sh -O
#执行quicklytest.sh
sudo bash quicklytest.sh
```
### Get Started
@@ -26,6 +40,8 @@ nexttrace 1.0.0.1
# 表格打印一次性输出全部跳数需等待20-40秒
nexttrace -table 1.0.0.1
# 实时打印 (-realtime与-table不能同时选择)
nexttrace -realtime 1.0.0.1
# IPv6 ICMP Trace
nexttrace 2606:4700:4700::1111
@@ -49,14 +65,43 @@ nexttrace -U -p 53 1.0.0.1
`NextTrace`也同样支持一些进阶功能,如 IP 反向解析、并发数控制、模式切换等
```bash
# 每一跳发送2个探测包
nexttrace -q 2 www.hkix.net
# 无并发,每次只发送一个探测包
nexttrace -r 1 www.hkix.net
# 打开IP反向解析功能在IPv6的骨干网定位辅助有较大帮助
nexttrace -rdns www.bbix.net
# 联合使用
nexttrace -r 1 -q 1 -report www.time.com.my
# 特色功能打印Route-Path图
# Route-Path图示例
# AS6453 塔塔通信「Singapore『Singapore』」
# ╭╯
# ╰AS9299 Philippine Long Distance Telephone Co.「Philippines『Metro Manila』」
# ╭╯
# ╰AS36776 Five9 Inc.「Philippines『Metro Manila』」
# ╭╯
# ╰AS37963 阿里云「ALIDNS.COM『ALIDNS.COM』」
nexttrace -report www.time.com.my
```
`NextTrace`支持用户自主选择 IP 数据库(目前支持:`LeoMoeAPI`, `IP.SB`, `IPInfo`, `IPInsight`
```bash
# 可以自行指定IP数据库[此处为IP.SB]不指定则默认为LeoMoeAPI
nexttrace -d IP.SB
## 特别的:其中 ipinfo API 需要从ipinfo自行购买服务如有需要可以clone本项目添加其提供的token自行编译
## TOKEN填写路径ipgeo/tokens.go
## 另外由于IP.SB被滥用比较严重会经常出现无法查询的问题请知悉。
```
`NextTrace`支持参数混合使用
```bash
Example:
nexttrace -d IPInsight -m 20 -p 443 -q 5 -r 20 -rdns -table 1.1.1.1
nexttrace -T -q 2 -r 1 -rdns -realtime -report 2001:4860:4860::8888
```
### IP 数据库
@@ -71,6 +116,8 @@ NextTrace 所有的的 IP 地理位置`API DEMO`可以参考[这里](https://git
```shell
Usage of nexttrace:
'nexttrace [options] <hostname>' or 'nexttrace <hostname> [option...]'
Options:
-T Use TCP SYN for tracerouting (default port is 80)
-U Use UDP Package for tracerouting (default port is 53 in UDP)
-V Check Version
@@ -88,36 +135,26 @@ Usage of nexttrace:
Set whether rDNS will be display
-realtime
Output trace results in runtime
-report
Route Path
-table
Output trace results as table
-report
Route Path
```
## 项目截图
![NextTrace Screenshot](asset/screenshot.png)
## FAQ 常见问题
如果你在安装或者使用的时候遇到了问题,我们建议你不要把新建一个 `issue` 作为首选项
或许可以在这里找到答案 -> [前往 Github Wiki](https://github.com/xgadget-lab/nexttrace/wiki/FAQ---%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94)
<!-- 等待一个更好的项目截图
## 项目截图
如果在搜索引擎WiKi 处还是没有解决,可以试试在本项目讨论区交流 -> [前往 Github Discussions](https://github.com/xgadget-lab/nexttrace/discussions)
![](asset/screenshot.png)
-->
<!--
Leo注描述可能不合适建议再加以斟酌已经修改
## History
- v0.0.6.alpha - Now
- https://github.com/xgadget-lab/nexttrace
- 因为项目计划调整更名并转移到当前仓库。重构了部分代码提高了效率增加了ICMP(IPv4 & IPv6)支持,并规划了更多功能。
- 最初版本 - v0.0.5.alpha
- https://github.com/OwO-Network/traceroute
- 感谢 Leo (leo.moe) & Vincent (vincent.moe) 发起了这个项目,并完成了最初的工作。
-->
最终如果你确认遇到的是 BUG、上述方法都不能解决的话请按照提供好的模版在 Issues 区提出问题 -> [前往 Github Issues](https://github.com/xgadget-lab/nexttrace/issues)
## Thanks

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 KiB

After

Width:  |  Height:  |  Size: 907 KiB

1
go.mod
View File

@@ -11,7 +11,6 @@ require (
require (
github.com/mattn/go-colorable v0.1.9 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/panjf2000/ants/v2 v2.5.0 // indirect
)
require (

4
go.sum
View File

@@ -1,4 +1,3 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -13,8 +12,6 @@ github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/panjf2000/ants/v2 v2.5.0 h1:1rWGWSnxCsQBga+nQbA4/iY6VMeNoOIAM0ZWh9u3q2Q=
github.com/panjf2000/ants/v2 v2.5.0/go.mod h1:cU93usDlihJZ5CfRGNDYsiBYvoilLvBF5Qp/BT2GNRE=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rodaine/table v1.0.1 h1:U/VwCnUxlVYxw8+NJiLIuCxA/xa6jL38MY3FYysVWWQ=
@@ -52,7 +49,6 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -1,6 +1,8 @@
package ipgeo
import "strings"
import (
"strings"
)
type IPGeoData struct {
Asnumber string

View File

@@ -2,7 +2,9 @@ package ipgeo
import (
"io/ioutil"
"log"
"net/http"
"os"
"time"
"github.com/tidwall/gjson"
@@ -11,7 +13,7 @@ import (
func IPSB(ip string) (*IPGeoData, error) {
url := "https://api.ip.sb/geoip/" + ip
client := &http.Client{
// 2秒超时
// 2 秒超时
Timeout: 2 * time.Second,
}
req, _ := http.NewRequest("GET", url, nil)
@@ -19,11 +21,17 @@ func IPSB(ip string) (*IPGeoData, error) {
req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0")
content, err := client.Do(req)
if err != nil {
log.Println("api.ip.sb 请求超时(2s)请切换其他API使用")
return nil, err
}
body, _ := ioutil.ReadAll(content.Body)
res := gjson.ParseBytes(body)
if res.Get("country").String() == "" {
// 什么都拿不到证明被Cloudflare风控了
os.Exit(1)
}
return &IPGeoData{
Asnumber: res.Get("asn").String(),
Country: res.Get("country").String(),

55
main.go
View File

@@ -5,6 +5,7 @@ import (
"fmt"
"log"
"os"
"strings"
"time"
"github.com/xgadget-lab/nexttrace/ipgeo"
@@ -14,31 +15,47 @@ import (
"github.com/xgadget-lab/nexttrace/util"
)
var tcpSYNFlag = flag.Bool("T", false, "Use TCP SYN for tracerouting (default port is 80)")
var udpPackageFlag = flag.Bool("U", false, "Use UDP Package for tracerouting (default port is 53 in UDP)")
var fSet = flag.NewFlagSet("", flag.ExitOnError)
var tcpSYNFlag = fSet.Bool("T", false, "Use TCP SYN for tracerouting (default port is 80)")
var udpPackageFlag = fSet.Bool("U", false, "Use UDP Package for tracerouting (default port is 53 in UDP)")
var port = flag.Int("p", 80, "Set SYN Traceroute Port")
var numMeasurements = flag.Int("q", 3, "Set the number of probes per each hop.")
var parallelRequests = flag.Int("r", 18, "Set ParallelRequests number. It should be 1 when there is a multi-routing.")
var maxHops = flag.Int("m", 30, "Set the max number of hops (max TTL to be reached).")
var dataOrigin = flag.String("d", "LeoMoeAPI", "Choose IP Geograph Data Provider [LeoMoeAPI, IP.SB, IPInfo, IPInsight]")
var rdnsenable = flag.Bool("rdns", false, "Set whether rDNS will be display")
var routePath = flag.Bool("report", false, "Route Path")
var realtimePrint = flag.Bool("realtime", false, "Output trace results in runtime")
var tablePrint = flag.Bool("table", false, "Output trace results as table")
var ver = flag.Bool("V", false, "Check Version")
var numMeasurements = fSet.Int("q", 3, "Set the number of probes per each hop.")
var parallelRequests = fSet.Int("r", 18, "Set ParallelRequests number. It should be 1 when there is a multi-routing.")
var maxHops = fSet.Int("m", 30, "Set the max number of hops (max TTL to be reached).")
var dataOrigin = fSet.String("d", "LeoMoeAPI", "Choose IP Geograph Data Provider [LeoMoeAPI, IP.SB, IPInfo, IPInsight]")
var rdnsenable = fSet.Bool("rdns", false, "Set whether rDNS will be display")
var routePath = fSet.Bool("report", false, "Route Path")
var realtimePrint = fSet.Bool("realtime", false, "Output trace results in runtime")
var tablePrint = fSet.Bool("table", false, "Output trace results as table")
var ver = fSet.Bool("V", false, "Check Version")
func printArgHelp() {
fmt.Println("\nArgs Error\nUsage : 'nexttrace [option...] <hostname>' or 'nexttrace <hostname> [option...]'\nOPTIONS: [-VTU] [-d DATAORIGIN.STR ] [ -m TTL ] [ -p PORT ] [ -q PROBES.COUNT ] [ -r PARALLELREQUESTS.COUNT ] [-rdns] [ -realtime | -table ] -report")
fSet.PrintDefaults()
os.Exit(2)
}
func flagApply() string {
flag.Parse()
printer.Version()
target := ""
if len(os.Args) < 2 {
printArgHelp()
}
if !strings.HasPrefix(os.Args[1], "-") {
target = os.Args[1]
fSet.Parse(os.Args[2:])
} else {
fSet.Parse(os.Args[1:])
target = fSet.Arg(0)
}
if *ver {
os.Exit(0)
}
ipArg := flag.Args()
if flag.NArg() != 1 {
fmt.Println("Args Error\nUsage : ./nexttrace [-T] [-rdns] [-displayMode <displayMode>] [-d <dataOrigin> ] [ -m <hops> ] [ -p <port> ] [ -q <probes> ] [ -r <parallelrequests> ] <hostname>")
os.Exit(2)
if target == "" {
printArgHelp()
}
return ipArg[0]
return target
}
func main() {
@@ -89,6 +106,10 @@ func main() {
}
if *routePath {
// 如果为TCP SYN也打印路由跟踪结果
if *tcpSYNFlag {
printer.TracerouteTablePrinter(res)
}
r := reporter.New(res, ip.String())
r.Print()
return

View File

@@ -4,33 +4,73 @@ auto=False
#是否忽略一切警告,按默认执行
if [[ $1 == "--auto" ]]; then
auto=True
echo "自动运行中"
fi
usrPath="/usr/local/bin"
checkRootPermit() {
[[ $EUID -ne 0 ]] && echo "请使用sudo/root权限运行本脚本" && exit 1
function red(){
echo -e "\e[1;31m$1\e[0m"
}
checkSystemArch() {
arch=$(uname -m)
if [[ $arch == "x86_64" ]]; then
archParam="amd64"
fi
if [[ $arch == "aarch64" ]]; then
archParam="arm64"
fi
if [[ $arch == "arm64" ]]; then
archParam="arm64"
fi
if [[ $archParam == "" ]]; then
echo "未知的系统架构,请联系作者"
checkRootPermit() {
[[ $EUID -ne 0 ]] && red "请使用sudo/root权限运行本脚本" && exit 1
}
ask_if()
{
local choice=""
while [ "$choice" != "y" ] && [ "$choice" != "n" ]
do
red $1
read choice
done
[ $choice == y ] && return 0
return 1
}
#检查脚本更新
check_script_update()
{
[ "$(md5sum "${BASH_SOURCE[0]}" | awk '{print $1}')" == "$(md5sum <(curl -sL "https://github.com/xgadget-lab/nexttrace/raw/main/nt_install.sh") | awk '{print $1}')" ] && return 1 || return 0
}
#更新脚本
update_script()
{
if curl -sL -o "${BASH_SOURCE[0]}" "https://github.com/xgadget-lab/nexttrace/raw/main/nt_install.sh" || curl -sL -o "${BASH_SOURCE[0]}" "https://github.com/xgadget-lab/nexttrace/raw/main/nt_install.sh"; then
red "脚本更新完成,正在重启脚本..."
exec bash ${BASH_SOURCE[0]} --auto
else
red "更新脚本失败!"
exit 1
fi
}
ask_update_script()
{
if check_script_update; then
red "脚本可升级"
[[ $auto == True ]] && update_script
ask_if "是否升级脚本?(y/n)" && update_script
else
red "脚本已经是最新版本"
fi
}
checkSystemArch() {
arch=$(uname -m)
case $arch in
'x86_64')
archParam='amd64'
;;
'mips')
archParam='mips'
;;
'arm64'|'aarch64')
archParam="arm64"
;;
*)
red "未知的系统架构,请联系开发者."
exit 1
;;
esac
}
checkSystemDistribution() {
case "$OSTYPE" in
@@ -43,203 +83,76 @@ checkSystemDistribution() {
downPath="/var/tmp/nexttrace"
;;
*)
echo "unknown: $OSTYPE"
red "unknown: $OSTYPE"
exit 1
;;
esac
}
getLocation() {
echo "正在获取地理位置信息..."
red "正在获取地理位置信息..."
countryCode=$(curl -s "http://ip-api.com/line/?fields=countryCode")
}
installWgetPackage() {
echo "wget 正在安装中..."
# try apt
# 是时候直接使用 APT 来管理包了
apt-get -h &>/dev/null
if [ $? -eq 0 ]; then
# 先更新一下数据源有些机器数据源比较老可能会404
apt-get update -y &>/dev/null
apt-get --no-install-recommends install wget -y &>/dev/null
return 0
fi
# try yum
yum -h &>/dev/null
if [ $? -eq 0 ]; then
yum -y update &>/dev/null
yum install wget -y &>/dev/null
return 0
fi
# try dnf
dnf -h &>/dev/null
if [ $? -eq 0 ]; then
dnf check-update &>/dev/null
dnf install wget -y &>/dev/null
return 0
fi
# try pacman
pacman -h &>/dev/null
if [ $? -eq 0 ]; then
pacman -Sy &>/dev/null
pacman -S wget &>/dev/null
return 0
fi
# try zypper
zypper -h &>/dev/null
if [ $? -eq 0 ]; then
zypper refresh &>/dev/null
zypper install -y --no-recommends wget &>/dev/null
return 0
fi
# try brew
brew -v &>/dev/null
if [ $? -eq 0 ]; then
brew update &>/dev/null
brew install wget &>/dev/null
return 0
fi
# 有的发行版自带的wget只有 --help 参数
wget --help &>/dev/null
if [ $? -ne 0 ]; then
echo "wget 安装失败"
exit 1
checkPackageManger() {
if [[ "$(which brew)" ]]; then #务必将brew置于第一位,macOS的apt是假的
brew update
PACKAGE_MANAGEMENT_INSTALL='brew install'
PACKAGE_MANAGEMENT_REMOVE='brew uninstall'
elif [[ "$(which apt)" ]]; then
apt-get update
PACKAGE_MANAGEMENT_INSTALL='apt-get -y --no-install-recommends install'
PACKAGE_MANAGEMENT_REMOVE='apt-get purge'
elif [[ "$(which dnf)" ]]; then
dnf check-update
PACKAGE_MANAGEMENT_INSTALL='dnf -y install'
PACKAGE_MANAGEMENT_REMOVE='dnf remove'
elif [[ "$(which yum)" ]]; then
PACKAGE_MANAGEMENT_INSTALL='yum -y install'
PACKAGE_MANAGEMENT_REMOVE='yum remove'
elif [[ "$(which zypper)" ]]; then
zypper refresh
PACKAGE_MANAGEMENT_INSTALL='zypper install -y --no-recommends'
PACKAGE_MANAGEMENT_REMOVE='zypper remove'
elif [[ "$(which pacman)" ]]; then
PACKAGE_MANAGEMENT_INSTALL='pacman -Syu --noconfirm'
PACKAGE_MANAGEMENT_REMOVE='pacman -Rsn'
else
red "error: The script does not support the package manager in this operating system."
exit 1
fi
}
installJqPackage() {
echo "jq 正在安装中..."
# try apt
apt-get -h &>/dev/null
if [ $? -eq 0 ]; then
# 先更新一下数据源有些机器数据源比较老可能会404
apt-get update -y &>/dev/null
apt-get --no-install-recommends install jq -y &>/dev/null
return 0
fi
# try yum
yum -h &>/dev/null
if [ $? -eq 0 ]; then
yum -y update &>/dev/null
yum install jq -y &>/dev/null
return 0
fi
# try dnf
dnf -h &>/dev/null
if [ $? -eq 0 ]; then
dnf check-update &>/dev/null
dnf install jq -y &>/dev/null
return 0
fi
# try zypper
zypper -h &>/dev/null
if [ $? -eq 0 ]; then
zypper refresh &>/dev/null
zypper install -y --no-recommends jq &>/dev/null
return 0
fi
# try pacman
pacman -h &>/dev/null
if [ $? -eq 0 ]; then
pacman -Sy &>/dev/null
pacman -S jq &>/dev/null
return 0
fi
# try brew
brew -v &>/dev/null
if [ $? -eq 0 ]; then
brew update &>/dev/null
brew install jq &>/dev/null
return 0
fi
jq -h &>/dev/null
if [ $? -ne 0 ]; then
echo "jq 安装失败"
exit 1
fi
}
checkWgetPackage() {
wget -h &>/dev/null
if [ $? -ne 0 ]; then
if [[ $auto == True ]]; then
installWgetPackage
return 0
fi
read -r -p "您还没有安装wget是否安装? (y/n)" input
case $input in
[yY][eE][sS] | [yY])
installWgetPackage
;;
[nN][oO] | [nN])
echo "您选择了取消安装,脚本即将退出"
exit 1
;;
*)
installWgetPackage
;;
esac
fi
}
checkJqPackage() {
jq -h &>/dev/null
if [ $? -ne 0 ]; then
if [[ $auto == True ]]; then
installJqPackage
return 0
fi
read -r -p "您还没有安装jq是否安装? (y/n)" input
case $input in
[yY][eE][sS] | [yY])
installJqPackage
;;
[nN][oO] | [nN])
echo "您选择了取消安装,脚本即将退出"
exit 1
;;
*)
installJqPackage
;;
esac
fi
return 1
install_software() {
package_name="$1"
which "$package_name" > /dev/null 2>&1 && return
red "${package_name} 正在安装中...(此步骤时间可能较长,请耐心等待)"
if ${PACKAGE_MANAGEMENT_INSTALL} "$package_name"; then
red "info: $package_name is installed."
else
red "error: Installation of $package_name failed, please check your network."
exit 1
fi
}
checkVersion() {
checkJqPackage
echo "正在检查版本..."
nexttrace -h &>/dev/null
if [ $? -ne 0 ]; then
return 0
fi
red "正在检查版本..."
version=$(curl -sL https://api.github.com/repos/xgadget-lab/nexttrace/releases/latest | jq -r '.tag_name')
if [[ $version == "" ]]; then
echo "获取版本失败,请检查网络连接"
red "获取版本失败,请检查网络连接"
exit 1
fi
currentVersion=$(nexttrace -V | head -n 1 | awk '{print $2}')
currentVersion=$(nexttrace -V | head -n 1 | awk '{print $2}') &> /dev/null
if [[ $currentVersion == $version ]]; then
echo "当前版本已是最新版本"
red "当前版本已是最新版本"
exit 0
fi
echo 当前最新release版本${version}
echo 您当前的版本:${currentVersion}
red 当前最新release版本${version}
red 您当前的版本:${currentVersion}
if [[ $auto == True ]]; then
return 0
fi
@@ -249,7 +162,7 @@ checkVersion() {
return 0
;;
[nN][oO] | [nN])
echo "您选择了取消安装/更新,脚本即将退出"
red "您选择了取消更新,脚本即将退出"
exit 1
;;
*)
@@ -259,18 +172,11 @@ checkVersion() {
}
downloadBinrayFile() {
echo "正在获取最新版的 NextTrace 发行版文件信息..."
checkJqPackage
red "正在获取最新版的 NextTrace 发行版文件信息..."
# 简单说明一下Github提供了一个API可以获取最新发行版本的二进制文件下载地址对应的是browser_download_url根据刚刚测得的osDistribution、archParam获取对应的下载地址
if [[ $? -eq 1 ]]; then
# 支持 jq 不回退
# echo nexttrace_${osDistribution}_${archParam}
# red nexttrace_${osDistribution}_${archParam}
latestURL=$(curl -s https://api.github.com/repos/xgadget-lab/nexttrace/releases/latest | jq ".assets[] | select(.name == \"nexttrace_${osDistribution}_${archParam}\") | .browser_download_url")
latestURL=${latestURL:1:-1}
else
# 不支持 jq用户拒绝安装回退 awk
latestURL=$(curl -s https://api.github.com/repos/xgadget-lab/nexttrace/releases/latest | grep -i "browser_download_url.*${osDistribution}.*${archParam}" | awk -F '"' '{print $4}')
fi
if [ "$countryCode" == "CN" ]; then
if [[ $auto == True ]]; then
latestURL="https://ghproxy.com/"$latestURL
@@ -282,7 +188,7 @@ downloadBinrayFile() {
;;
[nN][oO] | [nN])
echo "您选择了不使用镜像,下载可能会变得异常缓慢,或者失败"
red "您选择了不使用镜像,下载可能会变得异常缓慢,或者失败"
;;
*)
@@ -292,46 +198,42 @@ downloadBinrayFile() {
fi
fi
echo "正在下载 NextTrace 二进制文件..."
red "正在下载 NextTrace 二进制文件..."
wget -O ${downPath} ${latestURL} &>/dev/null
if [ $? -eq 0 ]; then
echo "NextTrace 现在已经在您的系统中可用"
red "NextTrace 现在已经在您的系统中可用"
changeMode
mv ${downPath} ${usrPath}
if [[ ${osDistribution} == "darwin" ]]; then
xattr -r -d com.apple.quarantine ${usrPath}/nexttrace
fi
else
echo "NextTrace 下载失败,请检查您的网络是否正常"
red "NextTrace 下载失败,请检查您的网络是否正常"
exit 1
fi
}
changeMode() {
chmod +x ${downPath} &>/dev/null
[[ ${osDistribution} == "darwin" ]] && xattr -r -d com.apple.quarantine ${downPath}
}
runBinrayFileHelp() {
if [ -e ${usrPath} ]; then
${usrPath}/nexttrace -h
fi
red "You may need to execute a command to remove dependent software: $PACKAGE_MANAGEMENT_REMOVE wget jq"
}
addCronTask() {
if [[ $auto == True ]]; then
return 0
fi
read -r -p "是否添加自动更新任务?(y/n)" input
case $input in
[yY][eE][sS] | [yY])
if [[ ${osDistribution} == "darwin" ]]; then
crontab -l >crontab.bak
crontab -l >crontab.bak 2>/dev/null
sed -i '' '/nt_install.sh/d' crontab.bak
elif [[ ${osDistribution} == "linux" ]]; then
crontab -l >crontab.bak
crontab -l >crontab.bak 2>/dev/null
sed -i '/nt_install.sh/d' crontab.bak
else
echo "暂不支持您的系统,无法自动添加crontab任务"
red "暂不支持您的系统,无法自动添加crontab任务"
return 0
fi
echo "1 1 * * * $(dirname $(readlink -f "$0"))/nt_install.sh --auto >> /var/log/nt_install.log" >>crontab.bak
@@ -339,20 +241,22 @@ addCronTask() {
rm -f crontab.bak
;;
[nN][oO] | [nN])
echo "您选择了不添加自动更新任务,您也可以通过命令 再次执行此脚本 手动更新"
red "您选择了不添加自动更新任务,您也可以通过命令 再次执行此脚本 手动更新"
;;
*)
echo "您选择了不添加自动更新任务,您可以通过命令 再次执行此脚本 手动更新"
red "您选择了不添加自动更新任务,您可以通过命令 再次执行此脚本 手动更新"
;;
esac
}
# Check Procedure
checkRootPermit
ask_update_script
checkSystemDistribution
checkSystemArch
checkWgetPackage
checkJqPackage
checkPackageManger
install_software wget
install_software jq
checkVersion
# Download Procedure
@@ -361,4 +265,4 @@ downloadBinrayFile
# Run Procedure
runBinrayFileHelp
addCronTask
[[ $auto != True ]] && addCronTask

245
quicklytest.sh Normal file
View File

@@ -0,0 +1,245 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
Green_font="\033[32m" && Red_font="\033[31m" && Font_suffix="\033[0m"
Info="${Green_font}[Info]${Font_suffix}"
Error="${Red_font}[Error]${Font_suffix}"
echo -e "${Green_font}
#======================================
# Project: NextTrace https://github.com/xgadget-lab/nexttrace
# Copyright Notice:
# This script is ported from @KANIKIG https://github.com/KANIKIG/
# The developer team made some modifications to adapt to NextTrace under the GPL-3.0 LICENSE
# NextTrace:
# XGadget-lab Leo (leo.moe) & Vincent (vincent.moe) & zhshch (xzhsh.ch)
# IP Geo Data Provider: LeoMoeAPI
#======================================
${Font_suffix}"
check_root() {
[[ "$(id -u)" != "0" ]] && echo -e "${Error} must be root user !" && exit 1
}
checkNexttrace() {
echo -e "${Info} 正在检查Nexttrace..."
if curl -sL -O "https://github.com/xgadget-lab/nexttrace/raw/main/nt_install.sh" || curl -sL -O "https://github.com/xgadget-lab/nexttrace/raw/main/nt_install.sh"; then
bash nt_install.sh --auto > /dev/null
fi
}
ask_if()
{
local choice=""
while [ "$choice" != "y" ] && [ "$choice" != "n" ]
do
echo -e "${Info} $1"
read choice
done
[ $choice == y ] && return 0
return 1
}
#检查脚本更新
check_script_update()
{
[ "$(md5sum "${BASH_SOURCE[0]}" | awk '{print $1}')" == "$(md5sum <(curl -sL "https://github.com/xgadget-lab/nexttrace/raw/main/quicklytest.sh") | awk '{print $1}')" ] && return 1 || return 0
}
#更新脚本
update_script()
{
if curl -sL -o "${BASH_SOURCE[0]}" "https://github.com/xgadget-lab/nexttrace/raw/main/quicklytest.sh" || curl -sL -o "${BASH_SOURCE[0]}" "https://github.com/xgadget-lab/nexttrace/raw/main/quicklytest.sh"; then
echo -e "${Info} 脚本更新完成,正在重启脚本..."
exec bash ${BASH_SOURCE[0]}
else
echo -e "${Info} 更新脚本失败!"
exit 1
fi
}
ask_update_script()
{
if check_script_update; then
echo -e "${Info} 脚本可升级"
ask_if "是否升级脚本?(y/n)" && update_script
else
echo -e "${Info} 脚本已经是最新版本"
fi
}
check_mode() {
echo -e "${Info} Nexttrace目前支持以下三种协议发起Traceroute请求:\n1.ICMP\n2.TCP(速度最快,但部分节点不支持)\n3.UDP\n(IPv6暂只支持ICMP模式)" && read -p "输入数字以选择:" node
while [[ ! "${node}" =~ ^[1-3]$ ]]; do
echo -e "${Error} 无效输入"
echo -e "${Info} 请重新选择" && read -p "输入数字以选择:" node
done
[[ "${node}" == "1" ]] && TRACECMD="nexttrace"
[[ "${node}" == "2" ]] && TRACECMD="nexttrace -T"
[[ "${node}" == "3" ]] && TRACECMD="nexttrace -U"
echo -e "${Info} 结果是否制表?(制表模式为非实时显示)"
if ask_if "输入y/n以选择模式:" ; then
TRACECMD=${TRACECMD}" -rdns -table"
##Route-Path功能还未完善,临时替代:
[[ "${node}" == "2" ]] && TRACECMD=${TRACECMD}" -report"
##
else
TRACECMD=${TRACECMD}" -rdns -realtime"
##Route-Path功能还未完善,临时替代:
[[ "${node}" == "1" ]] && TRACECMD=${TRACECMD}" -report"
##
fi
#echo -e "${Info} 是否输出Route-Path?"
#ask_if "输入y/n以选择模式:" && TRACECMD=${TRACECMD}" -report"
}
test_single() {
echo -e "${Info} 请输入你要测试的目标 ip :"
read -p "输入 ip 地址:" ip
while [[ -z "${ip}" ]]; do
echo -e "${Error} 无效输入"
echo -e "${Info} 请重新输入" && read -p "输入 ip 地址:" ip
done
${TRACECMD} ${ip} | grep -v -E 'NextTrace|XGadget-lab|Data\ Provider'
repeat_test_single
}
repeat_test_single() {
echo -e "${Info} 是否继续测试其他目标 ip ?"
if ask_if "输入y/n以选择:" ; then
test_single
else
echo -e "${Info} 退出脚本 ..." && exit 0
fi
}
test_alternative() {
select_alternative
set_alternative
result_alternative
}
select_alternative() {
echo -e "${Info} 选择需要测速的目标网络: \n1.中国电信\n2.中国联通\n3.中国移动\n4.教育网"
read -p "输入数字以选择:" ISP
while [[ ! "${ISP}" =~ ^[1-4]$ ]]; do
echo -e "${Error} 无效输入"
echo -e "${Info} 请重新选择" && read -p "输入数字以选择:" ISP
done
}
set_alternative() {
[[ "${ISP}" == "1" ]] && node_1
[[ "${ISP}" == "2" ]] && node_2
[[ "${ISP}" == "3" ]] && node_3
[[ "${ISP}" == "4" ]] && node_4
}
node_1() {
echo -e "1.上海电信(天翼云)\n2.厦门电信CN2\n3.北京电信\n4.江苏电信\n5.广东深圳电信\n6.广州电信(天翼云)\n7.浙江电信" && read -p "输入数字以选择:" node
while [[ ! "${node}" =~ ^[1-7]$ ]]; do
echo -e "${Error} 无效输入"
echo -e "${Info} 请重新选择" && read -p "输入数字以选择:" node
done
[[ "${node}" == "1" ]] && ISP_name="上海电信" && ip=101.89.132.9
[[ "${node}" == "2" ]] && ISP_name="厦门电信CN2" && ip=117.28.254.129
[[ "${node}" == "3" ]] && ISP_name="北京电信" && ip=120.92.180.135
[[ "${node}" == "4" ]] && ISP_name="江苏电信" && ip=221.229.173.233
[[ "${node}" == "5" ]] && ISP_name="广东深圳电信" && ip=116.6.211.41
[[ "${node}" == "6" ]] && ISP_name="广州电信(天翼云)" && ip=14.215.116.1
[[ "${node}" == "7" ]] && ISP_name="浙江电信" && ip=115.236.169.86
}
node_2() {
echo -e "1.上海联通\n2.重庆联通\n3.北京联通\n4.安徽合肥联通\n5.江苏南京联通\n6.浙江杭州联通\n7.广东联通" && read -p "输入数字以选择:" node
while [[ ! "${node}" =~ ^[1-7]$ ]]; do
echo -e "${Error} 无效输入"
echo -e "${Info} 请重新选择" && read -p "输入数字以选择:" node
done
[[ "${node}" == "1" ]] && ISP_name="上海联通" && ip=220.196.252.174
[[ "${node}" == "2" ]] && ISP_name="重庆联通" && ip=113.207.32.65
[[ "${node}" == "3" ]] && ISP_name="北京联通" && ip=202.106.54.150
[[ "${node}" == "4" ]] && ISP_name="安徽合肥联通" && ip=112.122.10.26
[[ "${node}" == "5" ]] && ISP_name="江苏联通" && ip=112.85.231.129
[[ "${node}" == "6" ]] && ISP_name="浙江联通" && ip=60.12.214.156
[[ "${node}" == "7" ]] && ISP_name="广东联通" && ip=58.252.2.194
}
node_3() {
echo -e "1.上海移动\n2.四川成都移动\n3.北京移动\n4.浙江杭州移动\n5.广东移动\n6.江苏移动\n7.浙江移动" && read -p "输入数字以选择:" node
while [[ ! "${node}" =~ ^[1-7]$ ]]; do
echo -e "${Error} 无效输入"
echo -e "${Info} 请重新选择" && read -p "输入数字以选择:" node
done
[[ "${node}" == "1" ]] && ISP_name="上海移动" && ip=117.184.42.114
[[ "${node}" == "2" ]] && ISP_name="四川成都移动" && ip=183.221.247.9
[[ "${node}" == "3" ]] && ISP_name="北京移动" && ip=111.13.217.125
[[ "${node}" == "4" ]] && ISP_name="浙江移动" && ip=183.246.69.139
[[ "${node}" == "5" ]] && ISP_name="广东移动" && ip=221.179.44.57
[[ "${node}" == "6" ]] && ISP_name="江苏移动" && ip=120.195.6.129
[[ "${node}" == "7" ]] && ISP_name="浙江移动" && ip=183.246.69.139
}
node_4() {
ISP_name="北京教育网" && ip=211.68.69.240
}
result_alternative() {
echo -e "${Info} 测试路由 到 ${ISP_name} 中 ..."
${TRACECMD} ${ip} | grep -v -E 'NextTrace|XGadget-lab|Data\ Provider'
echo -e "${Info} 测试路由 到 ${ISP_name} 完成 "
repeat_test_alternative
}
repeat_test_alternative() {
echo -e "${Info} 是否继续测试其他节点?"
if ask_if "输入y/n以选择:" ; then
test_alternative
else
echo -e "${Info} 退出脚本 ..." && exit 0
fi
}
test_all() {
result_all '116.6.211.41' '广东东莞CN2'
result_all '101.95.110.149' '上海电信'
result_all '112.85.231.129' '江苏徐州联通'
result_all '120.199.239.1' '浙江杭州移动'
result_all '211.68.69.240' '北京教育网'
echo -e "${Info} 四网路由快速测试 已完成 "
}
result_all() {
ISP_name=$2
echo -e "${Info} 测试路由 到 ${ISP_name} 中 ..."
${TRACECMD} $1 | grep -v -E 'NextTrace|XGadget-lab|Data\ Provider'
echo -e "${Info} 测试路由 到 ${ISP_name} 完成 "
}
check_root
ask_update_script
checkNexttrace
check_mode
echo -e "${Info} 选择你要使用的功能: "
echo -e "1.选择一个节点进行测试\n2.四网路由快速测试\n3.手动输入 ip 进行测试"
read -p "输入数字以选择:" function
while [[ ! "${function}" =~ ^[1-3]$ ]]; do
echo -e "${Error} 缺少或无效输入"
echo -e "${Info} 请重新选择" && read -p "输入数字以选择:" function
done
if [[ "${function}" == "1" ]]; then
test_alternative
elif [[ "${function}" == "2" ]]; then
test_all
else
test_single
fi

View File

@@ -128,9 +128,8 @@ func (r *reporter) InitialBaseData() Reporter {
}
func (r *reporter) Print() {
var beforeActiveTTL uint16 = 1
var beforeActiveTTL uint16 = 0
r.InitialBaseData()
for i := uint16(1); i < r.targetTTL; i++ {
// 计算该TTL内的数据长度如果为0则代表没有有效数据
if len(r.routeReport[i]) == 0 {