获取环境变量的相反操作:os.Setenv()
来源:stackoverflow
时间:2024-02-22 08:54:23 374浏览 收藏
从现在开始,努力学习吧!本文《获取环境变量的相反操作:os.Setenv()》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!
我有一个 reg_expand_sz 类型的十六进制字符串列表。 样本: reg,[hkey_local_machine\softwar\wow6432node], "pathethic"=hex(2):43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00 ,57,00,53,00,\00,00 //忽略解析和格式化部分。
我需要将其转换为原始字符串。
预期输出: %systemroot%
实际输出: c:\windows
问题是,当用户最初运行命令终端时,它会展开: reg add hkey_local_machine\softwar\wow6432node /v pathetic /t reg_expand_sz /d "%systemroot%"。稍后使用实际扩展的字符串。例如:初始 %systemroot% = 实际 c:\windows。当我将十六进制字符串转换为常规字符串时,我得到 c:\windows。
这就是为什么我想知道是否有任何库或工具可以通过提供值来获取密钥,即反向。 c:\window :=os.getenv(???).
package main
import (
"encoding/hex"
"fmt"
"log"
"os"
)
func ctogostring(b []byte) string {
var buf []byte
for _, c := range b {
if c != 0 {
buf = append(buf, c)
}
}
return string(buf)
}
func main() {
str := "43003a005c00570049004e0044004f00570053000000" //%systemroot%
bs, err := hex.decodestring(str)
if err != nil {
panic(err)
}
//s := ctogostring(bs)
result := ctogostring(bs)
fmt.println(result)
f, err := os.openfile("rollback.bat", os.o_rdwr|os.o_create|os.o_trunc, 0755)
if err != nil {
log.fatal(err)
}
f.writestring(result + "\n")
}
我尝试过手动执行此操作,但扩展的字符串比我预期的要多。因此,我的程序是有限的。请告知此问题的任何解决方案。 `
func reverseEnvVar(value string) string {
// Use os.ExpandEnv() to expand environment variables in the input string
expanded := os.ExpandEnv(value)
// Check if the expanded string matches a known environment variable value
switch expanded {
case os.Getenv("SystemRoot"):
return "%systemroot%"
case os.Getenv("ProgramFiles"):
return "%programfiles%"
case os.Getenv("ProgramFiles(x86)"):
return "%programfiles(x86)%"
case os.Getenv("AppData"):
return "%appdata%"
case os.Getenv("LocalAppData"):
return "%localappdata%"
case os.Getenv("UserProfile"):
return "%userprofile%"
case os.Getenv("TEMP"):
return "%temp%"
case os.Getenv("TMP"):
return "%tmp%"
default:
// If the expanded string doesn't match a known environment variable value,
// return the original input value
return value
}
}正确答案
我没有找到一个接受 c:\windows 并提供 %systemroot% 的库,但它可以使用 os.environ() 轻松实现。
进口:
import (
"errors"
"fmt"
"os"
"strings"
)
值 -> 键数组的哈希映射:
func createenvhashmap() map[string][]string {
envmap := make(map[string][]string)
for _, env := range os.environ() {
pair := strings.splitn(env, "=", 2)
if len(pair) == 2 {
key := fmt.sprintf("%%%s%%", strings.tolower(pair[0]))
value := pair[1]
envmap[value] = append(envmap[value], key)
}
}
return envmap
}
返回给定值的键列表的函数:
func getenvkeysbyvalue(envmap map[string][]string, value string) ([]string, error) {
keys, found := envmap[value]
if !found {
return nil, errors.new("no environment variable keys found for the value")
}
return keys, nil
}
现在您可以在主函数中使用 getenvkeysbyvalue() 函数:
func main() {
// create a map of environment variables and their keys
envmap := createenvhashmap()
// this value can be replaced with the result variable in your main() function
value := "c:\\windows"
// get environment variable keys by value
keys, err := getenvkeysbyvalue(envmap, value)
if err != nil {
fmt.println("error:", err)
return
}
fmt.println("environment variable keys:")
for _, key := range keys {
fmt.println(key)
}
}
输出:
Environment variable keys: %systemroot% %windir%
这样就不需要手动编写 switch case 语句了。
确保仅调用 createenvhashmap() 一次,然后多次调用 getenvkeysbyvalue(envmap, value) 以在 o(1) 时间内获取键列表。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《获取环境变量的相反操作:os.Setenv()》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
Golang · Go问答 | 21小时前 | 并发 · channel · select · 性能排查 · Go问答 · select Go channel context default CPU飙高 忙等循环 ticker438 收藏
-
Golang · Go问答 | 22小时前 | pprof · trace · 性能排查 · Go问答 · 服务安全 · Go pprof 生产环境 trace 安全入口 net/http/pprof 性能排障349 收藏
-
Golang · Go问答 | 22小时前 | channel · 并发编程 · Go问答 · 背压 · 容量规划 · Goroutine channel 缓冲区 背压 Go问答 buffered channel 并发容量377 收藏
-
Golang · Go问答 | 23小时前 | interface · 单元测试 · 架构设计 · repository · Go问答 · 单元测试 架构设计 interface 接口设计 Go问答 调用方定义 Repository212 收藏
-
Golang · Go问答 | 23小时前 | JSON · time.Time · 接口设计 · Go问答 · encoding/json · encoding/json API响应 JSON序列化 time.Time omitempty Go问答 omitzero315 收藏
-
Golang · Go问答 | 23小时前 | HTTP · Cookie · 浏览器 · cors · Go问答 · SameSite · cookie cors Secure SameSite Go问答 Set-Cookie 跨站请求 credentials246 收藏
-
Golang · Go问答 | 1天前 | 中间件 · Context · Go问答 · 架构模式 · 代码边界 · 中间件 context Context.Value Go问答 WithValue 请求作用域 业务参数269 收藏
-
Golang · Go问答 | 1天前 | JSON · 后端开发 · Go问答 · encoding/json · 接口解析 · JSON解析 encoding/json DisallowUnknownFields Go问答 RawMessage json.Decoder UseNumber151 收藏
-
Golang · Go问答 | 1天前 | HTTP · net/http · Go问答 · 流式响应 · ResponseController · net/http FLUSH 流式响应 Go问答 ResponseController FullDuplex 写超时161 收藏
-
Golang · Go问答 | 1天前 | HTTP · sse · Go问答 · 用户体验 · 流式响应 · Go EventSource SSE Go问答 Server-Sent Events 长任务进度 http.Flusher293 收藏
-
Golang · Go问答 | 1天前 | Timer · 性能优化 · time.After · Go问答 · Go 内存优化 Timer time.After Go问答 time.NewTimer Go1.23384 收藏
-
Golang · Go问答 | 1天前 | go · Context · 并发编程 · 接口超时 · 超时控制 goroutine泄漏 WithTimeout Go context Go问答 CancelFunc477 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习