【问题标题】:How to execute the following command line expression from java code?如何从 java 代码执行以下命令行表达式?
【发布时间】:2020-02-01 04:16:08
【问题描述】:

我正在使用 Mac,我正在尝试使用 java 代码运行以下命令来激活 Sauce 连接以连接到 Sauce Lab

bin/sc -u "username" -k "ACCESS KEY"

我必须在特定文件夹中运行它,假设我的文件夹位于其中

/Users/username/Documents/sc-4.5.4-osx

但我在运行代码时遇到异常

java.io.IOException: 无法运行程序 "/Users/username/Documents/sc-4.5.4-osx": error=13, Permission denied

包括下面的代码

String[] command = { "/Users/username/Documents/sc-4.5.4-osx", "bin/sc -u username -k accesskey" };    
    try {
        Runtime.getRuntime().exec(command);
        System.out.println("tunnel started");
    } catch (IOException e) {
        e.printStackTrace();
    }

【问题讨论】:

  • 您需要命令数组中的第一个字符串作为可执行文件本身。尝试将其指定为:String[] command = { "/Users/username/Documents/sc-4.5.4-osx/bin/sc", "-uusername", "-kaccesskey" };
  • 好的,现在没有异常,我认为它正在运行,我还有一个疑问,有没有一种方法可以让我们在执行命令时直观地看到或得到正在发生的事情的响应?看起来命令已执行,但酱汁连接仍然未激活,所以我想通过查看命令行响应进行调试。感谢 Mcarlin 的帮助
  • Runtime.getRuntime().exec(command) 返回一个Process object,它具有获取输出流和错误流的方法。从那里您可以读取该过程的输出。
  • 谢谢你 MCarlin,我会试试的
  • 没问题,祝你好运!

标签: java macos unix command-line saucelabs


【解决方案1】:

您需要命令数组中的第一个字符串是可执行文件本身,而每个附加元素都是命令的参数。正如@Gordon Davisson 指出的那样,这个 String[] 应该是解析后的形式。现在它正在尝试执行不起作用的目录。尝试将其指定为:

String[] command = { "/Users/username/Documents/sc-4.5.4-osx/bin/sc", "-uusername", "-kaccesskey" };

编辑 1 添加有关 args 的更多信息(感谢@GordonDavisson)

【讨论】:

  • 这里要注意的另一件事是,每个参数都作为数组的单独(字符串)元素传递,而不是像在命令中那样以空格分隔(也可能用引号括起来)线。通常,shell 采用单个字符串,将其拆分为空格,解析和删除引号等,并从中生成参数列表。在这里,我们传递的是原始参数列表,所以它必须是解析后而不是解析前的形式。
  • 感谢@GordonDavisson 提供更多信息
猜你喜欢
  • 2012-07-08
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多