gohost -- go 开发的命令行hosts配置管理工具

article/2025/7/17 7:50:33

前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,?,调研了下,发现它使用了gocui,使用它可以做出来很多很炫的命令行工具。

现有的hosts工具里面也有switchosts!,但我是用的时候发现他还是有bug,也只能用在界面化平台。想了下,准备着手搞一个命令行的hsots配置工具,这个类库完全可以满足。

界面设计

在界面设计上,还是做个copycat,抄袭switchosts!的,分两栏,左侧是hosts分组,右边儿是当前聚焦hosts分组内容,控制开关放在左侧,如下所示。左侧开关控制每个组的开启关闭与否,系统当前的hosts是左侧所有打开hosts的集合。

*------*-------------------*
|×name1|# hosts for name2  |
|√name2|1.1.1.1 a.com      |
|×name3|0.0.0.0 abc.com    |
|      |                   |
|      |                   |
|      |                   |
*------*-------------------*

hosts实现原理

原理和switchosts!的类似,通过修改系统hosts文件来达到目的,每次修改的变动都会实时的体现到系统hosts文件中,这样就实现了控制hosts的目的。

hosts 配置软件                    系统hosts
*------*-------------------*     *-------------------------*
|×name1|# hosts for name2  |     |# hosts for name2        |
|√name2|1.1.1.1 a.com      |     |1.1.1.1 a.com            |
|√name3|0.0.0.0 abc.com    |     |0.0.0.0 abc.com          |  
|      |                   | =>  |# hosts for name3        |
|      |                   |     |127.0.0.1 localhost      |
|      |                   |     |                         |
*------*-------------------*     *-------------------------*

gocui为我们提供了什么

gocui是一个很强大的库,就像他所说的那样Go Console User Interface,提供一个命令行用户界面。他为我们赋予了控制刷新terminal的能力,比如将terminal分为多个view(分区),每个view可以独立控制刷新,响应键盘的事件,所以,只要你愿意,甚至可以做出一些简单的小游戏。

gohosts

目前为止gohosts的功能基本已开发完成,主要有功能就是切换hosts,有如下交互:

  1. 聚焦左侧view时,通过shift + a组合键,创建新的hosts分组。
  2. 通过tab键,切换左侧、右侧view。
  3. 聚焦弹层view时,当创建新的hosts分组的时候,会进入弹层view,输入内容后,按下enter键生效。
  4. 聚焦左侧view时,通过上下箭头切换hosts分组。
  5. 聚焦左侧view时候,通过左右箭头切换hosts分组开关。

gohosts实现

因为要修改hosts,所以运行程序的时候也必须要使用root权限,初次运行的时候,会自动进行初始化,生成backup分组,并将系统当前已有hosts内容放入其中。

gohosts的配置文件会放在运行用户的家目录下面的.gohost文件夹下,每次启动的时候,会从其中读取配置文件,并展现出来。另外,为了做兼容,区分了windows系统和linux系统,通过getUserHome函数获取用户家目录。另外作为一个copycat,从switchosts!哪里了解到,有的windows系统盘不装在C盘,通过getWinSystemDir获取windows的系统盘目录,做到尽可能的全平台、多环境兼容。

func getUserHome() string {home := ""if runtime.GOOS == "windows" {home = os.Getenv("USERPROFILE")} else {home = os.Getenv("HOME")}return home
}func getWinSystemDir() string {dir := ""if runtime.GOOS == "windows" {dir = os.Getenv("windir")}return dir
}

另外这里2次使用了go协程来检验语法,启动软件的时候,启动协程,每隔50ms检测一次输入的内容是否合规,如下所示,协程中是个死循环,如果不合规,标红展示。

go func() {for range time.Tick(time.Millisecond * 50) {// do something}
}()

比如我们输入hosts配置的时候,必须满足下面3中正则,不然会提示哪一行有错误。

"^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}(?:[  ]{1,})(?:[ 0-9a-zA-Z._-]{1,}){1,}$"
"^[    ]*$"
"^#.*"

还有我们输入新建hosts分组的时候,如果hosts分组名字已经存在了,或者hosts分组名字超过长度了,也会在输入弹层view中提示标红。

golang的协程处理这些内容简直得天独厚,处理起来很轻松,也很简单高效。

另外比较麻烦的地方就是控制光标焦点了,左侧增加hosts分组的时候,还有当分组个数超过最大显示行数的时候,这就相当用画布、画框的情况,当移动焦点的时候,需要对应的做出移动画布还是移动画框,哈哈,有兴趣的可以看看代码中的逻辑。

gohosts效果展示

图片描述

图片描述

总结

自己已经实际使用了几天了,还算好用,比较遗憾的就是不支持中文,中文会出现显示不全的问题,这是依赖库导致的,改起来估计比较费劲,不过对于hosts来说,全英文也没问题。

原文链接:
http://www.5aikid.com/2018/08...

github地址:
https://github.com/aizuyan/go...

另外这是第一次真正的使用golang做出一些有用的东西,感觉还挺不错,准备稍微闲点儿了,好好研究下这个
依赖库gocui。


http://chatgpt.dhexx.cn/article/2AwBNvNa.shtml

相关文章

Android studio占用C盘资源的解决方法

Android studio占用C盘资源的解决方法 Android Studio安装成功后会在系统盘用户目录下产生这几个文件夹 一、目录介绍 1、.android 是Android SDK生成的AVD(Android Virtual Device Manager)即模拟器存放路径 2、.AndroidStudio4.0(这里我安…

Minecraft神奇玩家不用键盘,行走全部靠骑猪最后通关MC

大家好,在Minecraft中有非常多的玩法,但是您听说过全程游戏不用键盘只用鼠标通关的玩法吗?也就是说在游戏中不能使用WSAD和空格按键通关!这听起来简直就是天方夜谈了! 在国外有位玩家叫做HeightAdvantage的玩家&#…

2021大树分享收集的网盘搜索站给兄弟们

聚合网盘搜索 https://www.chaonengso.com/ 某柠檬 https://www.moulem.com/ 史莱姆 http://www.slimego.cn/ 蓝菊花-城通网盘 http://www.lanjuhua.com google Drive搜索引擎 https://gezhong.vip/ 陈蛋蛋的宝藏库 http://www.chendandan.ys168.com/ xx资料网 https://www.xxu…

WPF窗体最小化到任务栏

WPF程序也可以很轻松的实现类似QQ那样最小化到任务栏的功能。 WindowState ws;WindowState wsl;NotifyIcon notifyIcon;

android ip格式化输入法,手机键盘还能这样玩?简单几步,让你的输入法萌动可人!...

玩手机,打字忙,输入法你用的是原厂、还是第三方?相信大多数网友跟我一样,换了新手机,会在第一时间安装自己习惯的第三方输入法。 相对而言,我更喜欢百度输入法,它的优势之一便是拥有种类丰富、脑…

渗透测试 ( 1 ) --- 相关术语、必备 工具、导航、全流程总结、入侵网站思路

From:https://zhuanlan.zhihu.com/p/401413938 渗透测试实战教学:https://www.zhihu.com/column/c_1334810805263515648 导航类网站: 渗透师网络安全从业者安全导航(速查小手册)​ 渗透师导航:https…

csgo原始输入开不开_CSGO职业哥参数配置:帅气猪猪JW

在CSGO游戏中,狙击手一直都扮演着团队中非常重要的位置,无论是进攻还是防守,利用狙击的远距击杀,不仅能够造成人数上面的领先,同时还可以打乱对方的战术安排部署,是真正的牵一发而动全身的关键位置。 那么,我们今天来介绍的是这么一位狙击手,CSGO圈中是这么评价他的:在…

dialog dismiss时键盘不消失的问题。

当setCanceledOnTouchOutside(true),点击阴影处,dialog dismiss时键盘不消失的问题。 一开始觉得很简单,监听下onDimiss()方法,在里面隐藏键盘不就行了。 但是发现大多数手机都不会隐藏(魅族x4…

pe没法给服务器装系统吗,U盘重装系统无法进入PE解决方法

使用U盘启动盘重装系统,进不去PE怎么办?制作好U盘启动盘,准备装系统的时候,遇到不能进入PE的情况该怎么解决?下面小编整理一篇教程,帮助大家解决这个问题。 首先先分析u盘装系统不能进入pe的原因&#xff1…

真正的黑客键盘

IT程序猿 微博网友评论: 金先生不睡觉:甚至没有退格键! O2酱:复读机的键盘:Ctrl,C,V 蓝天草地生活:高手专用! 吴彦猪猪_yzy:其实不需要done 某个序列表示don…

LeetCode500. 键盘行

项目场景: 行百里路者半九十 问题描述 键盘行 给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中: 第一行由字符 “qwertyuiop” 组成。 第二行由字符 “asdfghjkl” 组成…

又一款度盘不限速下载神器,无需登录,10M/s!

开局一张图 这是我最新发现的一款百度云下载工具 简介 有一个网站叫 6盘,这个网站呢,可以转存百度网盘的资源。 然后再将转存的文件下载就可以不限速下载了。 然后,工具的作者觉得 6盘网页版还行,PC版丑拒。 于是,一时…

推荐6款珍藏已久的网盘搜索工具

最近收集了几款好用的网盘资源搜索网站,可能你已经在用了,可能你还不知道它的存在 。如果你已经在用了,说明你很有远光,好的搜索网盘将大大提高我们平时的搜索资源的效率 。 1 胖次搜索 胖次网盘搜索引擎,独家的索引挖掘技术,为您…

深度linux没有硬盘,安装Deepin系统到硬盘分区部分没有发现硬盘数据的解决

使用华为笔记本安装Deepin系统非常的顺利,但是在使用戴尔笔记本安装Deepin的时候却不那么如意,在安装到选择语言后,进展到硬盘分区部分,却没有发现硬盘数据,如下图所示,没有任何的数据,这里就不…

设计模式六大原则

前言,最近参加了面试,问道了设计模式的六大原则,当时一阵尴尬,现在总结一下,设计模式的六大原则如下: 定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭 …

服务器查看系统盘位置,服务器上查看硬盘位置

服务器上查看硬盘位置 内容精选 换一换 云硬盘可以做什么?云硬盘(Elastic Volume Service, EVS)可以为云服务器提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务。成长地图带您由浅入深学习日常使用和维护EVS,包含EVS基础知识,EVS计费方式,EVS的使用方法以及常见问…

鼓励员工离婚,宣布996的有赞还能走多久?

1月27日,移动零售服务商有赞在公司年会上宣布了公司即将执行996工作制的决定,这一决定不仅引起了部分员工的不满,还导致了一些员工呼吁匿名拨打市长热线进行举报。除了实施996工作制度外,有赞公司在年会上还以任正非劝准备离职的高…

有赞,你咄咄逼人的样子很难看

今天看到一则消息,有人爆料,有赞年会中,公司高层公然提出“996”工作制,同时还有一些令人有些毁三观的言论,在这里就不一一列举,大家可以搜索一下,便能知晓。这事在社交平台上迅速传播&#xff…

GitHub又有了新功能:域名控诉互联网公司996行为。一个小时之后,标星就超过了1000

继女装大佬图片分享,割韭菜大佬卖鸡汤之后,GitHub又有了新功能: 控诉互联网公司侵权行为。 原来,是有人注册了一个叫做996.icu的域名,并且在这个网站上大举控诉部分互联网公司实行996工作制的行为。 并且,还点名批评了近期因为员工关系被推上风口浪尖的有赞和京东 作者…