当前位置: 首页 > news >正文

【Go语言小工具】Mikrotik批量替换程序

【Go语言小工具】Mikrotik批量替换程序

Go语言非常适合做一些命令行小工具,编译下面这个代码生成golang-mikrotik-replace.exe文件

package mainimport ("flag""fmt""net/url""os""strings""github.com/go-routeros/routeros"
)func main() {// 默认 URL 来自环境变量defaultURL := os.Getenv("MIKROTIK_URL")if defaultURL == "" {defaultURL = "//user:pass@127.0.0.1:8728/ip/address"}// 命令行参数rawURL := flag.String("url", defaultURL, "Mikrotik API URL (格式: //user:pass@host:port/path)")// 覆盖选项overrideUser := flag.String("user", "", "覆盖用户名")overridePass := flag.String("pass", "", "覆盖密码")overrideHost := flag.String("host", "", "覆盖整个 host (hostname:port)")overrideHostname := flag.String("hostname", "", "覆盖 hostname,不改端口")overridePort := flag.String("port", "", "覆盖端口,不改 hostname")overridePath := flag.String("path", "", "覆盖路径 (例如 /ip/address)")// 逻辑参数field := flag.String("field", "address", "需要替换的字段")search := flag.String("search", "", "要查找的字符串")target := flag.String("target", "", "替换后的字符串")debug := flag.Bool("debug", false, "打印最终 URL 调试信息")flag.Parse()// 解析 URLparsedURL, err := url.Parse(*rawURL)if err != nil {panic(err)}// 覆盖 user/passif *overrideUser != "" {parsedURL.User = url.UserPassword(*overrideUser, *overridePass)} else if *overridePass != "" && parsedURL.User != nil {parsedURL.User = url.UserPassword(parsedURL.User.Username(), *overridePass)}// 覆盖 Host/Hostname/Portif *overrideHost != "" {// 覆盖整个 host:portparsedURL.Host = *overrideHost} else {// 覆盖 hostnameif *overrideHostname != "" {port := parsedURL.Port()if port != "" {parsedURL.Host = fmt.Sprintf("%s:%s", *overrideHostname, port)} else {parsedURL.Host = *overrideHostname}}// 覆盖 portif *overridePort != "" {hostOnly := parsedURL.Hostname()parsedURL.Host = fmt.Sprintf("%s:%s", hostOnly, *overridePort)}}// 覆盖 pathif *overridePath != "" {parsedURL.Path = *overridePath}// 拆分 user/passuser := ""pass := ""if parsedURL.User != nil {user = parsedURL.User.Username()pass, _ = parsedURL.User.Password()}apiAddr := parsedURL.HostrunPath := parsedURL.Pathif *debug {fmt.Println("DEBUG INFO:")fmt.Println("  User:", user)fmt.Println("  Pass:", pass)fmt.Println("  Host:", apiAddr)fmt.Println("  Hostname:", parsedURL.Hostname())fmt.Println("  Port:", parsedURL.Port())fmt.Println("  Path:", runPath)fmt.Println("  Field:", *field)fmt.Println("  Search:", *search)fmt.Println("  Target:", *target)fmt.Println()}// 连接 Mikrotik APIc, err := routeros.Dial(apiAddr, user, pass)if err != nil {panic(err)}defer c.Close()re, err := c.Run(runPath + "/print")if err != nil {panic(err)}// 遍历结果for _, sentence := range re.Re {id := sentence.Map[".id"]source := sentence.Map[*field]replaced := strings.ReplaceAll(source, *search, *target)if source != replaced {fmt.Printf("替换 %s -> %s\n", source, replaced)_, err = c.Run(runPath+"/set",fmt.Sprintf("=.id=%s", id),fmt.Sprintf("=%s=%s", *field, replaced),)if err != nil {panic(err)}}}
}

首先设置环境变量MIKROTIK_URL=//user:pass@127.0.0.1:8728/ip/address
然后通过下面的命令行示例代码即可执行操作

golang-mikrotik-replace.exe -hostname 100.100.0.113 -path /ip/address -field address -search 172.17.0. -target 172.18.0.
golang-mikrotik-replace.exe -hostname 100.100.0.113 -path /ip/route -field gateway -search 172.17.0. -target 172.18.0.
golang-mikrotik-replace.exe -hostname 100.100.0.113 -path /ip/firewall/nat -field to-addresses -search 172.17.0. -target 172.18.0.
golang-mikrotik-replace.exe -hostname 100.100.0.113 -path /ip/firewall/nat -field dst-address -search 172.17.0. -target 172.18.0.
http://www.hskmm.com/?act=detail&tid=23265

相关文章:

  • 10.2刷题计划
  • 树莓派搭建NAS之二:安装OpenMediaVault(OMV)
  • dp 总结 1
  • 2025年10月3日
  • Python作用域知识梳理
  • 美化中转站
  • go mod 面试题
  • 多轮对话系统设计的逻辑陷阱与解决方案
  • 【光照】[PBR][菲涅尔]实现方法对比
  • 20251002NOIP模拟赛
  • P10279 [USACO24OPEN] The Winning Gene S题解
  • zsh
  • 从零搭建雷池WAF:环境配置、安装部署与Web防护实战
  • 论文速读记录 | 2025.10
  • 【Rust GUI开发入门】编写一个本地音乐播放器(15. 记录运行日志) - Jordan
  • 6 种常见 AI 编程协作便捷的方法总结
  • DeploySharp开源发布:让C#部署深度学习模型更加简单
  • 别样的国庆作业大战
  • ROS2之服务
  • macOS上优雅运行Docker容器
  • 题解:CF1770H Koxia, Mahiru and Winter Festival
  • HarmonyOS之LocalStorage - 详解
  • Spring Boot Logback:实现定时任务日志与业务日志隔离 - Higurashi
  • 网络流 最小割 Dinic算法
  • 15.VLANIF(2025年9月30日) - 教程
  • 树莓派搭建NAS之一:安装系统
  • 新手Markdown学习
  • 马云归来,“新零售”不死 - 指南
  • RNN
  • 10.2笔记