You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:23:11