Java中Process执行xfreerdp失败,改用bash调用正常,求原因
为什么直接用ProcessBuilder调用xfreerdp会认证失败,bash -c方式却正常?
核心问题出在参数里的多余引号
你第一种写法里,给用户名、密码参数加了双引号,比如/u:""+c.getUsername()+"",最终生成的参数是/u:"admin"(假设用户名是admin)。但ProcessBuilder的command方法是直接把数组里的每个元素原封不动传给xfreerdp,不像shell会把引号当成参数分割的标记——这里的双引号会被xfreerdp当成用户名的一部分,相当于你用"admin"(带引号)去登录,自然会触发STATUS_LOGON_FAILURE。
两种调用方式的本质区别
- 直接调用ProcessBuilder:每个数组元素都是xfreerdp接收的原始参数,引号不会被解析,完全作为参数内容的一部分。
- 用
/bin/bash -c调用:bash会先解析整个命令字符串,把引号作为参数边界的标记,去掉引号后再把正确的参数传递给xfreerdp,所以实际传给xfreerdp的是/u:admin这种正确格式。
修复第一种写法的正确方式
直接去掉参数里的双引号就行,ProcessBuilder本身就能处理带空格的参数,不需要额外加引号:
String usernameWithPrefix = "/u:" + c.getUsername(); String passwordWithPrefix = "/p:" + c.getPassword(); String targetIpAdressWithPrefix = "/v:" + targetIpAdress; processBuilder.command("xfreerdp", usernameWithPrefix, passwordWithPrefix, targetIpAdressWithPrefix, "+auth-only", "/cert:ignore"); processBuilder.redirectErrorStream(true); process = processBuilder.start(); process.waitFor(); String res = new String(process.getInputStream().readAllBytes());
如果你的用户名或密码里有空格、特殊字符,ProcessBuilder会自动处理参数的传递边界,不会像shell那样把参数拆碎,完全不用手动加引号。
内容的提问来源于stack exchange,提问作者user15698505
相关产品推荐
相关产品推荐

