我有一个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();
}
}
有人可以帮助我吗?
答案 0 :(得分:0)
我看到两个问题:
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
,我还没有尝试过。exec("echo password | sudo /bin/sh -c \"echo 7 > /sys/class/gpio/export\"")
警告这是危险的!!! sudo
kdesudo
替换
sudoers
配置,以便相关用户永远不需要输入sudo
的密码 - 不推荐。