我正在使用ProcessBuilder来执行bash命令:
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
Process pb = new ProcessBuilder("gedit").start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
但我想做这样的事情:
Process pb = new ProcessBuilder("sudo", "gedit").start();
如何将超级用户密码传递给bash?
("gksudo", "gedit")
将无法解决问题,因为自Ubuntu 13.04以来它已被删除,我需要使用默认命令执行此操作。
修改
gksudo在最后一次更新时回到了Ubuntu 13.04。
答案 0 :(得分:31)
我认为你可以使用它,但我发布它有点犹豫。所以我只想说:
使用此风险,风险自负,不推荐,不要起诉我等等......
public static void main(String[] args) throws IOException {
String[] cmd = {"/bin/bash","-c","echo password| sudo -S ls"};
Process pb = Runtime.getRuntime().exec(cmd);
String line;
BufferedReader input = new BufferedReader(new InputStreamReader(pb.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
}
答案 1 :(得分:12)
使用visudo编辑/ etc / sudoers并为您的用户授予特定脚本的NOPASSWD权限:
用户名ALL =(ALL)NOPASSWD:/opt/yourscript.sh
答案 2 :(得分:5)
我的解决方案是,不在命令行中公开密码,它只是将密码提供给进程的输出流。这是一种更灵活的解决方案,因为您可以在需要时向用户请求密码。
public static boolean runWithPrivileges() {
InputStreamReader input;
OutputStreamWriter output;
try {
//Create the process and start it.
Process pb = new ProcessBuilder(new String[]{"/bin/bash", "-c", "/usr/bin/sudo -S /bin/cat /etc/sudoers 2>&1"}).start();
output = new OutputStreamWriter(pb.getOutputStream());
input = new InputStreamReader(pb.getInputStream());
int bytes, tryies = 0;
char buffer[] = new char[1024];
while ((bytes = input.read(buffer, 0, 1024)) != -1) {
if(bytes == 0)
continue;
//Output the data to console, for debug purposes
String data = String.valueOf(buffer, 0, bytes);
System.out.println(data);
// Check for password request
if (data.contains("[sudo] password")) {
// Here you can request the password to user using JOPtionPane or System.console().readPassword();
// I'm just hard coding the password, but in real it's not good.
char password[] = new char[]{'t','e','s','t'};
output.write(password);
output.write('\n');
output.flush();
// erase password data, to avoid security issues.
Arrays.fill(password, '\0');
tryies++;
}
}
return tryies < 3;
} catch (IOException ex) {
}
return false;
}
答案 3 :(得分:2)
不要试图在文件中明确地写入系统密码,特别是对于具有sudo privilage的用户,就像@jointEffort回答一样,发布的权限应由系统管理员而不是应用编写者解决。 sudo
允许您为特定用户授予特定命令的权限,这正是足够的,请检查this post
如果您只想在主#includedirs /etc/sudoers.d/
文件中附加/etc/sudoers
(大多数Linux发行版已经这样做了),您可以选择在主sudoers文件以外的单独文件中管理权限。使用{
ifconfig-user
之类的文件
USER_NAME ALL=(ALL) NOPASSWD: /sbin/ifconfig
另外,请记住使用visudo
编辑配置文件,以防在语法错误时失去对系统的控制。
答案 4 :(得分:1)
生成进程后,您可以提取输入和输出流。只需将密码提供给输出流(将其输出到proccess的输入中)。所以代码看起来像 -
Process pb = new ProcessBuilder("gedit").start();
OutputStream out = pb.getOutputStream();
out.write(password);
答案 5 :(得分:1)
我知道这是一个老线程,但我只想把它放在这里:
您可以使用sudo -S *command*
作为传递来创建Process实例的命令。然后获取输出流并将密码写入其中,并在其末尾添加一个新行和一个c。 return(\n\r
)。可能不需要返回但我通过它以防万一。此外,最好刷新流,以确保所有内容都写入其中。我做了几次,它就像一个魅力。并且不要忘记关闭流:)。