通过Runtime.exec()执行命令失败,但在Raspberry Pi(Linux)上手动执行时有效

时间:2016-10-02 21:41:15

标签: java linux raspberry-pi

当我尝试在Java中通过Runtime.exec()执行一组命令时,其中一些命令不起作用。然而,当我在终端中手动执行相同的命令时,它们都可以正常工作。我确保复制完全相同的命令,它们只在手动执行时才有效。可能导致问题的原因是什么?

这是我的代码:

rt = Runtime.getRuntime();
rt.exec("sudo wpa_cli -i " + ifName + " remove_network 0"); //Always removes network 0, in case it already exists
Thread.sleep(250);
rt.exec("sudo wpa_cli -i " + ifName + " add_network 0");
Thread.sleep(250);
rt.exec("sudo wpa_cli -i " + ifName + " set_network 0 ssid '\"" + SSID + "\"'");//This command only works when executed manually
Thread.sleep(250);
rt.exec("sudo wpa_cli -i " + ifName + " set_network 0 psk '\"" + Pass + "\"'");//This command only works when executed manually
Thread.sleep(250);
rt.exec("sudo wpa_cli -i " + ifName + " select_network 0");

我输入SSID和密码的命令是造成问题的命令。 ifName是我正在使用的NIC的名称。

请注意,我添加了几个Thread.sleep(),因为我不确定命令是否有时间在我调用下一个命令之前完成执行(因为这是配置网络并连接到它,我真的没有& #39;知道)。也许它们完全没用,但为了以防万一,我加了它们。

编辑:我知道这与报价重复无关,因为我已经尝试删除引号,但代码仍然无法正常工作。我一直从控制台收到相同的FAIL消息。

1 个答案:

答案 0 :(得分:0)

感谢@ user140547提供所有帮助!

最终通过执行rt.exec(new String[] {"sudo", "wpa_cli", "-i", ifName, "set_network", "0", "psk", "\""+Pass+"\""});来工作。看起来当手动执行命令时,你必须将密码放在简单和双引号之间(例如:'"ActualPassword"'),但是当使用rt.exec()时,绝对不应该使用简单的引号,你应该,实际上,记下双引号。

所以我猜这个问题毕竟与引用重复没有关系,因为我最终不得不写下引号。我仍然不确定为什么会发生这种情况。