[DevLog] RunTimeUtil, ProcessBuilder执行shell命令包含引号错误

33

问题

在使用 HuTool 中的 RunTimeUtil 工具包通过shell命令执行docker login时,由于密码参数多包裹了单引号,导致命令执行一直失败。

具体如下:

RunTimeUtil.exec("docker login -u admin -p '123456' my.harbor.net");

这个shell命令在控制台中可正常执行,然而程序执行一直报错 “unauthorized: authentication required”,如下:

分析及解决

先说结论,RunTimeUtil会将命令拆分为字符数据,之后ProcessBuilder会将字符中的所有内容作为参数传入命令中,即包裹密码的单引号也会作为密码内容,去掉单引号即可。在使用ProcessBuilder时参数内容不用加单引号或双引号。

查看HuTool工具包中的代码可得知,RunTimeUtil.exec 会将传入的shell命令拆分为字符数组,再传入ProcessBuilder,代码如下:

此时我传入的shell命令被拆分为字符数组:["docker", "login", "-u", "admin", "-p", "'123456'", "my.harbor.net"]

而ProcessBuilder在执行start时可以理解为一个终端,此时他会把传入的字符数组中第一个字符作为指令,之后的字符作为参数执行shell命令,如果在RunTimeUtil传入的命令中参数有单双引号,则单双引号会作为参数内容传入命令中。

例如我这里的docker login命令的密码就会包含单引号,执行时就报错密码错误,最后去掉单引号即可。