当前位置: 首页 > 知识库问答 >
问题:

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

裴焱
2023-03-14

我在javafx中开发应用程序,我尝试在终端中使用命令打开一个应用程序,我使用我的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();

这个过程没有给出任何输出,它停在那里,什么也没有发生。同样的命令,我已经尝试从终端和它的工作很好。

我已经尝试了这个链接中提到的事情

我还从我的java代码中运行命令“chmod+x”,这些命令运行良好。我最初的命令如下所示:-

runCommand = "echo" + " " + password + "| sudo -S " + "\"" + a.getAbsolutePath() + "\"" + " --deploymentFile="
                            + "\"" + b.getAbsolutePath() + "\"";

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

pb.getInputStream()

打印命令,当我复制和粘贴它是终端时,它运行良好。

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

在这里我也有以下错误

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 ...

共有1个答案

厉念
2023-03-14

苏多

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

这样可以避免将密码存储在应用程序或配置文件中的明文(或者最多稍微模糊)中,也可以避免使用调用sudo等的shell脚本调用shell。

mac上的授权

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

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

 类似资料:
  • 问题内容: 我正在使用ProcessBuilder执行bash命令: 但我想做这样的事情: 如何将超级用户密码传递给bash? 不会解决这个问题,因为它是从Ubuntu 13.04开始删除的,我需要使用默认命令来执行此操作。 编辑 gksudo在最近的更新中回到了Ubuntu 13.04。 问题答案: 我想您可以使用它,但是我有点犹豫要发布它。所以我只想说: 使用此方法后果自负,不建议您使用,请勿

  • 我正在使用ProcessBuilder执行bash命令: 编辑 gksudo带着最后一次更新回到了Ubuntu13.04。

  • 问题内容: 我想创建两个文件的差异。我尝试在Java中搜索可完成此操作的代码,但是没有找到任何简单的代码/实用程序代码。因此,我想如果我能以某种方式从我的Java代码中运行linux diff / sdiff命令并使它返回一个存储diff的文件,那就太好了。 假设有两个文件fileA和fileB。我应该能够通过我的Java代码将它们的差异存储在名为fileDiff的文件中。然后从fileDiff提

  • 问题内容: 我有一个Java项目,可以在Eclipse上正常运行。现在,我需要使用命令行来运行它,例如java classpath …如何在Eclipse中基于存储的类路径来设置该类路径。 问题答案: 只需导航到类文件所在的目录并使用 编辑:您可以将替换为任何类路径。例如,要查找您的类路径,可以使用 编辑:看起来像有相当多的信息,可以帮助你在这里。

  • 正在读取包列表。..已完成构建依赖关系树读取状态信息...执行E:无法找到包postgresql 我正在用WSL Ubuntu在Windows10上尝试odoo12开发。我想在windows 10中安装的linux子系统中安装postgres和odoo依赖项。请帮帮我.

  • 问题内容: 有没有办法在Java应用程序中运行此命令行? 我可以用命令运行它,但是我不能在Java中运行它。 问题答案: