首页 > 系统相关 >go exec.Command windows 参数引号转义问题

go exec.Command windows 参数引号转义问题

时间:2023-05-30 17:23:16浏览次数:45  
标签:exe SysProcAttr exec windows cmd notepad Command go

Go在windows上调用本地进程传参时的一个天坑

Golang

go在windows上exec.Command调用本地进程在传参的时候有一个天坑,举个栗子来说正常来说一般代码会这么写

 cmdLine := "notepad.exe " + `"D:\Program Files\Notepad++\session.xml"`
 cmd := exec.Command("cmd.exe", "/c", cmdLine)
 err := cmd.Run()

我们期望在拉起notepad的时候是会正常解析参数并打开xml文件的,但是,你可以尝试运行一下这段代码,结果并不是我们想的这样!

notepad在打开的时候会报一个非法路径,这是怎么回事呢?打开processexp看一下传入的参数如下

notepad.exe "D:\Program Files\Notepad++\session.xml"
看到在双引号中强制加入了转义符,一开始我以为这是string里强制加入的,想到这做法也太奇怪了,强制转string为byte[]后,一个一个对字符发现原字符串中根本就没有出现转义符,搜遍国内外只有提问的人,却没找到有效的解决办法。

想了一下,那这问题必然就出在Command解析中了,查看源码中有一段说明

On Windows, processes receive the whole command line as a single string and do their own parsing. Command combines and quotes Args into a command line string with an algorithm compatible with applications using CommandLineToArgvW (which is the most common way). Notable exceptions are msiexec.exe and cmd.exe (and thus, all batch files), which have a different unquoting algorithm. In these or other similar cases, you can do the quoting yourself and provide the full command line in SysProcAttr.CmdLine, leaving Args empty.

也就是说,针对cmd参数加的引号参数会有不同的逻辑,必须在SysProcAttr.CmdLine中写入原始参数了,但是Args留空,又会导致SysProcAttr值为nil,所以简单赋值也是不行的,那么正确的代码实现如下

 cmdLine := "notepad.exe " + `"D:\Program Files\Notepad++\session.xml"`
 cmd := exec.Command("cmd.exe")
 cmd.SysProcAttr = &syscall.SysProcAttr{CmdLine: "/c " + cmdLine}
 err := cmd.Run()

运行一下,果然notepad正确打开了文件

原文:https://oser.space/post/gocmd/

标签:exe,SysProcAttr,exec,windows,cmd,notepad,Command,go
From: https://www.cnblogs.com/DirWang/p/17443797.html

相关文章

  • pcdn go 采集nat类型
    packagemainimport( "fmt" stun"github.com/ppma/nat-type")const( STUN_SERVER="stun.qq.com" STUN_PORT=3478)funcmain(){ localAddr:=fmt.Sprintf("%s:%d","192.168.8.109",8569) stunAd......
  • windows web服务器代码移植到linux所采的坑
    windowsweb服务器代码移植到linux所采的坑一、导入问题不能直接将编译后的class文件放入linux服务器中,虽说java是跨平台性好,但是windows下的class文件是不能在linux下直接运行的.二、编译问题1.编码问题在linux端编译代码时,最先遇到的就是编码问题,默认是按ACSII码编译的,不行......
  • django-simpleui使用
    django-simpleui使用安装pipinstalldjango-simpleui豆瓣:http://pypi.douban.com/simple/中科大:https://pypi.mirrors.ustc.edu.cn/simple/清华:https://pypi.tuna.tsinghua.edu.cn/simple/settings配置INSTALLED_APPS=['simpleui',]升级simpleuipipinstal......
  • 技术招聘漫谈 | 正在招Golang工程师的你,赶快收藏这份识人秘籍!
    各位技术面试官,欢迎来到新一期的技术招聘漫谈专栏。在前两期的专栏中,我们解析了前端工程师以及 Java工程师 这两个常见技术岗位的招聘技巧。今天,我们想把目光聚焦在一个前景与“钱”景都非常火热的岗位——Golang开发工程师。《腾讯2022年度研发大数据报告》显示,Golang连......
  • Good-bye ESNI, hello ECH !(ESNI 与 ECH 的前世今生)
    在当时介绍TLS的最后,提到过虽然TLS能够加密整个通信过程,但是在协商的过程中依旧有很多隐私敏感的参数不得不以明文方式传输,其中最为重要且棘手的就是将要访问的域名,即SNI(ServerNameIndication)。同时还有用于告知客户端可用的应用层协议的ALPN拓展,泄露这个会导致攻击者知......
  • execve()系统调用和elf装载过程
    在进入execve()系统调用之后,Linux内核就开始进行真正的装配工作。在内核中,execve()系统调用相应的入口是sys_execve()。sys_execve()进行一些参数的检查复制之后,调用do_execve()。do_execve()会首先查找被执行的文件,如果找到文件,则读取文件的前128个字节。文件的前128个字节保存着......
  • gof-设计模式
    一、什么是设计模式设计模式(Designpattern)是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的高内聚和低耦合。1、创建型......
  • MD5 - windows也可以查询某个文件的MD5码
     命令格式certutil-hashfile文件名称md5 示例MicrosoftWindows[版本10.0.22621.1702](c)MicrosoftCorporation。保留所有权利。C:\Users\Harley·Hou\Desktop\getWifiPwd_logs>certutil-hashfilewifi-log-20230530.logmd5MD5的wifi-log-20230530.log哈希......
  • Windows驱动开发之开发环境的搭建(一)
    一、简介Windows驱动开发是指为Windows操作系统编写内核模式驱动程序的过程。驱动程序是操作系统与硬件设备之间的桥梁,它负责管理和控制硬件设备,使其能够与操作系统和应用程序进行交互。随着windows系统的更新迭代,windows驱动开发技术也是不断的升级:从最早期的VXD(VirtualX......
  • go语言math包及标准输入
    数值处理取整fmt.Println(1/2,3/2,5/2)fmt.Println(-1/2,-3/2,-5/2)fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~")fmt.Println(math.Ceil(2.01),math.Ceil(2.5),math.Ceil(2.8))fmt.Println(math.Ceil(-2.01),math.Ceil(-2.5),math.Ceil(-2.8))fmt.Printl......