Java命令未执行

时间:2015-01-15 19:05:18

标签: java linux

我有一个Java-App,它应该执行一个sh命令 我的命令看起来像sudo /bin/sh -c "echo 7 > /sys/class/gpio/export",当我在计算机的命令提示符中执行它时,它可以工作,但不能用我的Java-Programm。

Programm-line看起来像这样:

System.out.println(CmdExecutor.execute("sudo /bin/sh -c \"echo 7 > /sys/class/gpio/export\""));


public class CmdExecutor {

public static String execute(String[] cmd) {
    StringBuffer output = new StringBuffer();

    Process p;
    try {
        p = Runtime.getRuntime().exec(cmd);
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line).append("\n");
        }

    } catch (IOException | InterruptedException e) {
    }

    return output.toString();
}

public static String execute(String cmd) {
    StringBuffer output = new StringBuffer();

    Process p;
    try {
        p = Runtime.getRuntime().exec(cmd);
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line).append("\n");
        }

    } catch (IOException | InterruptedException e) {
    }

    return output.toString();
}

}

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我看到两个问题:

  • 需要在Java中拆分多个参数。
  • 使用sudo进行身份验证。

需要拆分多个参数。

如果运行exec("a b"),系统将查找名为a b的命令作为单个字符串命令名称。

如果你运行exec("a", "b"), the system will look for a command named一个and pass b`作为该程序的参数。

所以你想做的是execute("sudo", "/bin/sh", "-c", "echo 7 > /sys/class/gpio/export")

sudo可能需要身份验证

使用sudo执行命令时,将执行身份验证。如果您从同一进程执行多个sudo命令,系统将为方便起见缓存身份验证,但基本上需要进行身份验证。

使用sudo进行身份验证通常意味着您需要提供密码。

sudo之所以/sys/class/gpio/export拥有-w-------所拥有的权限root root(200),这意味着没有人可以阅读它,只有root可以写它

您有几个选择:

  • 更改该文件的权限,以便每个人都可以编写它(不推荐):chmod a+w /sys/class/gpio/export
  • 更改该文件的权限,以便相关用户可以对其进行编写:setfacl -m user:cher:w /sys/class/gpio/export - 请注意,这只适用于sysfs装有acl选项的情况,通常情况下不是。我不知道是否可以使用sysfs选项挂载acl,我还没有尝试过。
  • 将密码传递给sudo命令:exec("echo password | sudo /bin/sh -c \"echo 7 > /sys/class/gpio/export\"") 警告这是危险的!!!
  • 使用sudo
  • 等图形kdesudo替换
  • 更改您的sudoers配置,以便相关用户永远不需要输入sudo的密码 - 不推荐。