突然又对 Go 感兴趣,GOPATH entry cannot start with shell metacharacter 错误

文章讲述了作者在使用Go语言定制化混淆出包过程中遇到的问题,即映射文件中的随机生成字符(如包名和类名)包含敏感字符,影响了提审效率。作者寻求解决办法,即开发工具优化随机生成的映射值,确保不存在敏感字符,同时也分享了自己学习和解决问题的过程。

打发无聊时间,水文一篇~

在这里插入图片描述

事情是这样的,因为我们上架的渠道包基本是定制化混淆出包,

混淆出包有一个关键点就是指定映射文件,映射文件的内容有一部分是使用外部工具在打包前按照一定规律随机生成包名、类名,

这里使用的外部工具可以是 golang 编写的 exe 程序,映射文件内容类似 Android mapping.txt。

举个例子:

渠道包提审自动化检测通常是不允许包体存在第三方插件或危险代码。

1、广告插件,上架荣耀商店是不允许包体存在其他平台的广告插件。

2、危险代码,上架国内某平台是不允许包体存在诸如 weishu、xposted 等带有危险特征的代码。

所以,定制化混淆出包、加固出包上架提审一定程度上可以躲避自动化检测。

那么我的问题是:测试反馈映射文件随机生成的字符(包名、类名)总是存在敏感字符,影响出包效率,影响提审。

如某平台机审核把 weishu 判定为敏感字符,若包体带有该字符去提审有可能被拒审打回,出包之后就要确保包体不存在危险敏感字符,

希望能够确保映射文件的映射值不存在敏感字符(因为之前反馈的敏感字符基本是因为类映射导致的),

因此我的任务是接受映射文件生成工具,优化随机生成的映射值,确保不存在敏感字符,

需求很简单,最终优化修改、新增的代码不多,工具是使用 Go 编写的,上一次接触这个语言还是在大学那会,对此学习和已掌握的知识不对,

“语言知识工具、技能”,有了良好的编程思维,接触一门新语言还是相对轻松的,那就现学现卖完成了优化需求,

回到家猛一抬头心想:我是不是对 Go 又有了一点点兴趣?趁着现在的无聊时间,不如打开电脑重新拾起!

我对 Go 又有了兴趣~

安装 Go

学习新语言先看官方文档是个不错的切入点,但对英语有一定的门槛,不妨试试国人整理的资料。

Go 中文学习文档

1、下载 go sdk Go sdk all release

我下载的是 Mac ARM64

2、下载开发工具

我还是选择 vscode,golang 虽然很好用但是收费,破解版、激活这些活不想折腾,vscode 轻量好用

3、运行确认环境正确

其实整篇文章只想提这一点,其他都是在水文,运行第一个 go 程序报错了,在 vscode 上遇到一个小问题。

在这里插入图片描述

GOPATH 配置有问题?我可是傻瓜式直接安装下载的 go sdk,一路 next,这也能报错!

go: GOPATH entry cannot start with shell metacharacter ‘~’

go: GOPATH条目不能以shell元字符“~”开头

在终端执行 go env 也是这个错误,查一下环境变量 GOPATH 看看具体是啥,
在这里插入图片描述
在这里插入图片描述

自我感觉没啥不对劲,PATH 也不存在什么以 ~ 开头的字符,尝试下把 GOPATH 前面的 ${PATH} 去掉试试看,修改并保存之后使配置生效执行 source .bash_profile

在这里插入图片描述

关闭 vscode 重新打开没有再提示 GOPATH 错误,在终端运行 go env 也没有错误并输出正常的信息,看来这次尝试偶然解决了运行失败的问题(罗.jpg)。

在这里插入图片描述

写代码配阿里通义灵码也蛮不错,不懂就问~

那就这样吧,在无聊时光中不知道干什么好,刷短视频 ,就找点事情做,人总不能太闲吧~

安装 Go pkg

经过上述操作,在 vscode 中已经可以编写运行 golang 程序了,但是又发现了一个问题:怎么没有代码提示?

预期的正常代码提示是这样的,后知后觉才发现之前输入 fmt 没有提示 Println等函数,没有提示我怎么写代码,我很依赖代码提示、补全功能的。

在这里插入图片描述

vscode 很友好,其实当你创建第一个 go 文件时已经提示安装一些列的,那时我是直接点击安装的,但是最后提示安装这个我是没有特别关注,直到过了两天因一直困惑在没有代码提示功能中才开始关注这个报错。

详细看看日志:

问题(1):go install ******* timeout,install failed

后来了解到,go 有一个东西叫包管理,也就是 go install 安装的就是一系列的包,安装位置就是你配置的 GOPATH(在自己 mac 上首次安装查看环境变量是没有给我指定 GOPATH,我也不知道为啥;但是我在 window 上安装是不需要我手动配置)

安装超时,猜测估计是下载超时,因为我没有梯子。后台得知有一个环境变量 GOPROXY 可以配置代理,指定包下载来源。

在 mac 上配置几个环境变量 vim .bash_profilesource .bash_profile,然后重启 vscode、重新安装能够下载成功了!紧接着第二个问题又来了~

在这里插入图片描述

(2)问题:copy fail,no permission on /usr/local/go/bin,install fail

这个路径就是我当前的 GOROOT go 安装位置下的 bin 目录,查看 bin 目录权限是drwxr-xr-x,修改扩大权限看看,sudo chmod -R 777 bin(你也可以不使用 -R 参数先试试),然后权限变成了drwxrwxrwx,再重启 vscode 重新安装,没有错误了,安装成功了,代码提示也有了~

在这里插入图片描述

在这里插入图片描述

(3)问题:package command-line-arguments is not a main package

这个问题之间随便在当前目录新建 go 文件执行怎么没报错,今天竟然不行(难道是我在这新建目录执行 go mod init 导致的?),不细究缘由,看报错信息较容易读懂,那就创建一个包名 main,把主函数移动到这个包下再运行,一切正常!

在这里插入图片描述

环境具备,终于可以开始跟随官网文档学习了!

### 关于GOPATH设置为相对路径的问题 在Go语言中,GOPATH的值必须是一个绝对路径[^5]。如果GOPATH被设置为相对路径,Go编译器会抛出错误提示“GOPATH entry is relative must be absolute path”。这是因为Go工具链需要确保所有路径是明确且唯一的,以便正确地定位源代码、依赖项和生成的二进制文件。 #### 解决方案 为了修复此问题,可以按照以下方式调整GOPATH的设置: 1. **确保GOPATH为绝对路径**: 在macOS系统中,可以通过`export GOPATH=/absolute/path/to/gopath`命令将GOPATH设置为一个绝对路径。例如: ```bash export GOPATH=$HOME/go ``` 2. **检查当前GOPATH设置**: 使用`go env GOPATH`命令可以查看当前的GOPATH设置是否正确。如果输出的是相对路径,则需要重新设置为绝对路径。 3. **更新环境变量配置文件**: 为了使GOPATH设置永久生效,可以将其添加到`.bashrc`、`.zshrc`或`.profile`文件中。例如,在`.zshrc`文件中添加以下内容: ```bash export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin ``` 4. **验证路径有效性**: 使用`os.path.isabs()`函数(Python中的方法)或直接通过shell命令检查路径是否为绝对路径。例如: ```bash echo $GOPATH | grep '^/' ``` 如果输出为空,则表示路径不是绝对路径。 #### 示例代码 以下是一个简单的Go程序,用于检查GOPATH是否为绝对路径: ```go package main import ( "fmt" "path/filepath" ) func main() { gopath := filepath.Getenv("GOPATH") if !filepath.IsAbs(gopath) { fmt.Println("Error: GOPATH must be an absolute path.") } else { fmt.Printf("GOPATH is set correctly: %s\n", gopath) } } ``` ### 注意事项 - 如果使用的是Go Modules(Go 1.11及以上版本默认启用),则无需显式设置GOPATH,因为模块模式下GOPATH的作用被弱化。 - 在macOS上,推荐将GOPATH设置为用户主目录下的`go`文件夹,例如`$HOME/go`。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值