如何在 Java 中使用 sudo 权限执行 bash 命令?
- 2024-10-10 09:29:00
- admin 原创
- 82
问题描述:
我正在使用 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。
解决方案 1:
我认为您可以使用它,但我有点犹豫是否发布它。所以我只想说:
请自行承担风险使用,不推荐,不要起诉我,等等...
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();
}
解决方案 2:
使用 visudo 编辑 /etc/sudoers 并授予用户针对特定脚本的 NOPASSWD 权限:
用户名 ALL=(ALL) NOPASSWD: /opt/yourscript.sh
解决方案 3:
我的解决方案不会在命令行中暴露密码,而只是将密码提供给进程的输出流。这是一个更灵活的解决方案,因为允许您在需要时向用户请求密码。
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('
');
output.flush();
// erase password data, to avoid security issues.
Arrays.fill(password, ' ');
tryies++;
}
}
return tryies < 3;
} catch (IOException ex) {
}
return false;
}
解决方案 4:
不要尝试在文件中清楚地写入系统密码,尤其是对于具有 sudo 权限的用户,正如@jointEffort 回答的那样,颁发的权限应该由系统管理员而不是应用程序编写者来解决。
sudo
允许您向特定用户授予特定命令的权限,这足够精确,请查看此帖子
并且您可以选择在主sudoers文件之外的单独文件中管理权限,如果您愿意,只需将其附加#includedirs /etc/sudoers.d/
到主/etc/sudoers
文件中(大多数 Linux 发行版已经这样做了)并创建如下文件ifconfig-user
:
USER_NAME ALL=(ALL) NOPASSWD: /sbin/ifconfig
另外,请记住编辑配置文件,visudo
以防当出现语法错误时您失去对系统的控制。
解决方案 5:
我知道这是一个老话题但我只想把它放在这里:
您可以将sudo -S *command*
其用作传递的命令来创建 Process 实例。然后获取输出流并将密码写入其中,并在其末尾添加一个新行和一个 c。return( `
`)。return 可能不是必需的,但我还是传递了它以防万一。刷新流也是一个好主意,以确保所有内容都写入其中。我已经做过几次了,效果很好。不要忘记关闭流 :)。
解决方案 6:
生成进程后,您可以提取输入和输出流。只需将密码输入到输出流(将其输出到进程的输入中)。因此,代码看起来类似于 -
Process pb = new ProcessBuilder("gedit").start();
OutputStream out = pb.getOutputStream();
out.write(password);
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件