无法通过Java发送OS X终端命令

时间:2015-10-14 19:38:25

标签: java iphone macos networking

我正在尝试查看OS X上的iPhone是否处于tehtered模式,我无法使用此代码发送终端命令:

String [] cmdArray = new String[1];
cmdArray[0] = "/usr/sbin/networksetup -getinfo \"iPhone USB\"";
SendCommandForResponse(cmdArray);

...

   static String SendCommandForResponse(String[] commandArray) throws IOException {
        InputStream processOutput;
        BufferedReader reader = null;
        String line = " ", output = " ";
        Runtime rt = Runtime.getRuntime();
        Process p = rt.exec(commandArray);
        processOutput = p.getInputStream();
        reader = new BufferedReader(new InputStreamReader(processOutput));
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
            output += line + "\n";
        }
        return output;

    }

运行此代码时,我收到此错误:

  

IOException:java.io.IOException:无法运行程序   " / usr / sbin / networksetup -getinfo" iPhone USB"":error = 2,没有这样的文件   或目录

我可以手动通过终端成功运行此命令,但在NetBeans中运行时会出现异常。我究竟做错了什么?我是OS X上的Java新手。

1 个答案:

答案 0 :(得分:3)

你应该像这样填写命令数组:

String[] cmdArray = new String[3];
cmdArray[0] = "/usr/sbin/networksetup";
cmdArray[1] = "-getinfo";
cmdArray[2] = "iPhone USB";

或简而言之:

String[] cmdArray = { "/usr/sbin/networksetup", "-getinfo", "iPhone USB" };
  • 第一项应该只是命令(要运行的程序)
  • 接下来的项目是参数
  • 不需要在带有空格的参数周围添加额外的引号。

当您直接从Terminal运行命令时, shell 会解释该命令并为您分离 - 这就是您需要引号的原因。但是当您从Java运行它时,该命令不会传递给shell而且不会被解析。你必须自己分离命令和参数。