序言

在前文 Mac及Linux 如何使用自动化脚本登录JumpServer堡垒机及后面的服务器 中我们提到,使用 pythononetimepass 可能会出现偶尔 otp 不正确的情形,比如会生成 5位数 的otp密码。因此可以使用 Go 语言的代替。

本文就使用 MFA的实现代码进行缩减试验。

MFA 的 Go 代码

package main

import (
	"fmt"
	"os"

	"github.com/spf13/viper"
	"github.com/xlzd/gotp"
)

// 从 %HOME%/.mfa.yml 读取个人的跳板机配置秘钥生成与Google Authenticator 兼容的 MFA 一次性密码
func main() {
	home, _ := os.UserHomeDir()
	viper.AddConfigPath(".")
	viper.AddConfigPath(home)
	viper.SetConfigType("yml")
	viper.SetConfigName(".mfa")
	err := viper.ReadInConfig()
	if err != nil {
		panic(fmt.Sprintf("Cannot reading from config file:%s", viper.ConfigFileUsed()))
	}
	s := viper.GetString("MFA_SECRET")
	fmt.Println(gotp.NewDefaultTOTP(s).Now())
}

代码比较简单,从配置文件中读取 MFA_SECRET 然后生成 otp 密码并打印到控制台。

正常编译

go build .

无任何优化措施,编译的结果是 6.0MB

优化编译

go build -ldflags="-s -w" .

去除符号表及调试信息等,编译的结果是 4.2MB,缩减了 30% 的样子。

upx 终极优化

使用 upx 这个可执行程序压缩工具进行优化。 Mac 平台安装 upx

brew install upx

然后使用 upx 对已经去除符号表及调试信息的版本进行打包优化

# -9标识优化级别,从 1-9,数字越大压缩率越高,压缩过程耗时越长
# 压缩 mfa-ld 这个程序,并输出到 mfa
upx -9 -o mfa mfa-ld

upx 这个版本将程序压缩到了 1.8MB,只有最初版本的 30%

总结

整个 mfa 应用程序从最初的 6MB 压缩到 1.8MB,只有最初版本的 30%

对于网络传输及捉襟见肘的磁盘空间而言真是个太好的消息了!