如何在java中为OS X运行sudo命令

use*_*361 9 java macos bash

我正在使用javafx中的app,我正在尝试使用终端中的命令打开一个应用程序,我正在使用我的java代码运行命令我的命令有一些变量它有我的安装程序文件的路径,因为文件名不会总是相同可以在更新构建时有所不同.
这是一个示例,因为我正在运行命令它不是我正在运行的确切命令,但命令格式是相同的.

Process process = Runtime.getRuntime().exec("echo password | sudo -S open -a safari");
    String line;
    BufferedReader input = new BufferedReader(new InputStreamReader(pb.getInputStream()));
    while ((line = input.readLine()) != null) {
        System.out.println(line);
    }
    input.close();
Run Code Online (Sandbox Code Playgroud)

这个过程没有提供任何输出它停在那里没有任何反应.我从终端试过的同样的命令,它工作正常.

我已尝试过此链接中提到的内容

如何在Java中使用sudo权限执行bash命令?

但它也没有奏效.

我也从我的java代码运行像"chmod + x"这样的命令,这些命令运行正常.我原来的命令是这样的: -

runCommand = "echo" + " " + password + "| sudo -S " + "\"" + a.getAbsolutePath() + "\"" + " --deploymentFile="
                            + "\"" + b.getAbsolutePath() + "\"";
Run Code Online (Sandbox Code Playgroud)

其中a.getAbsolutePath()是安装程序文件的路径,b.getAbsolutePath()是我们用于安装应用程序的部署文件的路径.

pb.getInputStream()
Run Code Online (Sandbox Code Playgroud)

打印命令,当我复制并粘贴它是终端它运行正常.

pb.getErrorStream()
Run Code Online (Sandbox Code Playgroud)

不给任何东西.

我试过跑步

String[] cmd = {"/bin/bash","-c","echo tester| sudo -S ","\"",a.getAbsolutePath(),"\"","\""," --deploymentFile=","\"",b.getAbsolutePath()};
Run Code Online (Sandbox Code Playgroud)

String[] cmd = {"/bin/bash","-c","echo tester| sudo -S",a.getAbsolutePath(),"--deploymentFile=","\"",b.getAbsolutePath()};
Run Code Online (Sandbox Code Playgroud)

在这里我得到了以下错误

getErrorStreamusage: sudo -h | -K | -k | -L | -V
getErrorStreamusage: sudo -v [-AknS] [-g groupname|#gid] [-p prompt] [-u user name|#uid]
getErrorStreamusage: sudo -l[l] [-AknS] [-g groupname|#gid] [-p prompt] [-U user name] [-u
getErrorStream            user name|#uid] [-g groupname|#gid] [command]
getErrorStreamusage: sudo [-AbEHknPS] [-C fd] [-g groupname|#gid] [-p prompt] [-u user
getErrorStream            name|#uid] [-g groupname|#gid] [VAR=value] [-i|-s] [<command>]
getErrorStreamusage: sudo -e [-AknS] [-C fd] [-g groupname|#gid] [-p prompt] [-u user
getErrorStream            name|#uid] file ...
Run Code Online (Sandbox Code Playgroud)

小智 10

须藤

我强烈建议编辑sudoers文件,并允许运行应用程序的用户通过sudo使用特定命令而不提示输入密码而不是进行echo passwd | sudo ...构造.

这样就可以避免在应用程序或配置文件中以明文(或者最好稍微混淆)存储密码,并且您无需使用调用sudo的shell脚本调用shell等.

可以通过命令编辑Sudoers visudo.在这里看一下如何在unbuntu上完成它,但在任何unix上都是一样的.https://askubuntu.com/questions/159007/how-do-i-run-specific-sudo-commands-without-a-password

补充参考:https://www.sudo.ws/man/1.8.16/sudoers.man.html

我觉得你问的是错误的问题......

在mac上授权

在需要执行需要额外权限的操作的mac应用程序上,不应该使用sudo来开始.

应用程序应该使用授权服务.

参考文献:


cb0*_*cb0 3

我认为您必须使用应用程序的完整路径。这应该有效:

Runtime rt = Runtime.getRuntime();
rt.exec("echo password | sudo -S open -a /Applications/Safari.app");
Run Code Online (Sandbox Code Playgroud)

更新

根据您的评论,您可以尝试拆分该过程。很有可能open需要互动会议。

创建一个脚本(例如 openSafari.sh),以用户身份打开 Safari。

#!/etc/bash
echo $1 | sudo -S open -a /Applications/Safari.app &
Run Code Online (Sandbox Code Playgroud)

使其可执行:chmod +x openSafari.sh,并从 java 调用该脚本。

Runtime rt = Runtime.getRuntime();
rt.exec("/pathTo/openSafari.sh 'sudoPassword'");
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

2131 次

最近记录:

9 年,5 月 前