Java 获得 bash root 权限
Java getting bash root access
我正在尝试为我正在制作的程序在 Linux 上安装缺少的依赖项。但是,我无法获得安装缺少的依赖项所需的根访问权限。这是我目前所拥有的:
我的逻辑是这样的:
1) 检查依赖是否使用pacapt安装(本例为npm)
2) 如果是,则使用文本提示获取用户密码
3) 然后像这样继续进一步的说明: echo [userpass] |须藤 -S ...
现在 'echo [userpass] | sudo -S ...' 命令像这样打印到 shell; [用户密码] | sudo -S ...(其中显示用户密码代替[userpass]),但不执行。
这是我的代码:
public class LinuxDependencyCheck extends Application{
public static void main (String [] args){
launch(args);
}
@Override
public void start(Stage mainWindow){
String userPass = null;
String terminalOut = null;
terminalOut = runBash("./LinuxScripts/pacapt -Qqe npm");
if (terminalOut.equals("npm")){
userPass = getUserPass();
if (userPass != null){
System.out.println("runing");
runBash("echo " + userPass + " | sudo -S npm install" +
" phantomjs2");
}
}
}
public String runBash(String runCommand){
String result = null;
String returnVal = null;
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(runCommand);
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
result += inputLine;
returnVal = inputLine;
}
in.close();
} catch (IOException e) {
System.out.println(e);
}
return returnVal;
}
public String getUserPass(){
TextInputDialog dialog = new TextInputDialog("Password");
dialog.setTitle("Installation helper");
dialog.setHeaderText("It looks like you are missing" +
" dependecies to complete this action" +
" would you like to try to install" +
" them now");
dialog.setContentText("Please enter your password :");
// Traditional way to get the response value.
Optional<String> result = dialog.showAndWait();
if (result.isPresent()){
return result.get().toString();
}
return result.get();
}
}
您的 runBash()
方法命名不当,因为它不会通过 bash
使给定命令成为 运行。因此,它也不适合与您指定的命令字符串一起使用,它依赖于 shell 的管道运算符将两个单独的命令串在一起。
当你这样做时...
runBash("echo " + userPass + " | sudo -S npm install" +
" phantomjs2");
... Java 在空格处拆分字符串,将第一个子字符串 ("echo") 作为命令,并以所有其他子字符串作为参数执行该命令。不用说,那将 运行 没有错误,但也没有你想要的效果。
如果你真的想通过 bash 执行命令字符串(看起来你这样做),那么在你的 runBash()
方法中你可以改变这个 ...
Process p = r.exec(runCommand);
...到这个...
Process p = r.exec("/bin/bash", "-c", runCommand);
。这至少应该让你跨过第一个障碍。
您还应该关闭 Process
的 OutputStream
(通过它您可以将数据传输到进程中),并排出 Process
的错误流。通常,您需要并行排出输入流和错误流,因为如果其中一个缓冲区已满,则进程可能会阻塞。也许对于这个特定的命令来说这不是一个风险,但你需要做出判断。它也是 waitFor()
Process
的好形式;这样做可以避免 Java 累积僵尸子进程。
我正在尝试为我正在制作的程序在 Linux 上安装缺少的依赖项。但是,我无法获得安装缺少的依赖项所需的根访问权限。这是我目前所拥有的:
我的逻辑是这样的:
1) 检查依赖是否使用pacapt安装(本例为npm) 2) 如果是,则使用文本提示获取用户密码 3) 然后像这样继续进一步的说明: echo [userpass] |须藤 -S ...
现在 'echo [userpass] | sudo -S ...' 命令像这样打印到 shell; [用户密码] | sudo -S ...(其中显示用户密码代替[userpass]),但不执行。
这是我的代码:
public class LinuxDependencyCheck extends Application{
public static void main (String [] args){
launch(args);
}
@Override
public void start(Stage mainWindow){
String userPass = null;
String terminalOut = null;
terminalOut = runBash("./LinuxScripts/pacapt -Qqe npm");
if (terminalOut.equals("npm")){
userPass = getUserPass();
if (userPass != null){
System.out.println("runing");
runBash("echo " + userPass + " | sudo -S npm install" +
" phantomjs2");
}
}
}
public String runBash(String runCommand){
String result = null;
String returnVal = null;
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(runCommand);
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
result += inputLine;
returnVal = inputLine;
}
in.close();
} catch (IOException e) {
System.out.println(e);
}
return returnVal;
}
public String getUserPass(){
TextInputDialog dialog = new TextInputDialog("Password");
dialog.setTitle("Installation helper");
dialog.setHeaderText("It looks like you are missing" +
" dependecies to complete this action" +
" would you like to try to install" +
" them now");
dialog.setContentText("Please enter your password :");
// Traditional way to get the response value.
Optional<String> result = dialog.showAndWait();
if (result.isPresent()){
return result.get().toString();
}
return result.get();
}
}
您的 runBash()
方法命名不当,因为它不会通过 bash
使给定命令成为 运行。因此,它也不适合与您指定的命令字符串一起使用,它依赖于 shell 的管道运算符将两个单独的命令串在一起。
当你这样做时...
runBash("echo " + userPass + " | sudo -S npm install" +
" phantomjs2");
... Java 在空格处拆分字符串,将第一个子字符串 ("echo") 作为命令,并以所有其他子字符串作为参数执行该命令。不用说,那将 运行 没有错误,但也没有你想要的效果。
如果你真的想通过 bash 执行命令字符串(看起来你这样做),那么在你的 runBash()
方法中你可以改变这个 ...
Process p = r.exec(runCommand);
...到这个...
Process p = r.exec("/bin/bash", "-c", runCommand);
。这至少应该让你跨过第一个障碍。
您还应该关闭 Process
的 OutputStream
(通过它您可以将数据传输到进程中),并排出 Process
的错误流。通常,您需要并行排出输入流和错误流,因为如果其中一个缓冲区已满,则进程可能会阻塞。也许对于这个特定的命令来说这不是一个风险,但你需要做出判断。它也是 waitFor()
Process
的好形式;这样做可以避免 Java 累积僵尸子进程。