我正在用Java设计一个小软件。我不知道我在做什么的术语/定义,但我正在提示从 Java 到终端的命令。像这样的东西:
Process process = Runtime.getRuntime().exec("command");
我以前在 Linux 中做过这个,我用于gksudo
需要 root 密码的命令。
gksudo
OS X 中有吗?任何图形弹出窗口要求输入 root 密码?
我正在用Java设计一个小软件。我不知道我在做什么的术语/定义,但我正在提示从 Java 到终端的命令。像这样的东西:
Process process = Runtime.getRuntime().exec("command");
我以前在 Linux 中做过这个,我用于gksudo
需要 root 密码的命令。
gksudo
OS X 中有吗?任何图形弹出窗口要求输入 root 密码?
您可以或多或少地使用 AppleScript shell 脚本编写自己的脚本:
#!/bin/sh
osascript -e "do shell script \"$*\" with administrator privileges"
cocoasudo
看起来更美观,但这已经部署了。
这看起来也很有希望:cocoasudo
它使用 OSX 原生授权服务 API:
对于基于 Mac OS X Cocoa 的应用程序,通过 Authorization Services API 提供了类似的 sudo 功能。使用 API 可以提示用户输入他们的用户名和密码,以请求提升权限的能力。
…</p>
对于这种情况,我编写了一个名为 cocoasudo 的小实用程序。使用 cocoasudo 的方式与使用 sudo 的方式大致相同。但是,不会在终端窗口中提示用户输入密码,而是通过授权服务 API 获得对话框提示。
如果您正在运行调用其他命令的 shell 脚本,我发现 cocoasudo 不起作用。您还必须在所有子命令中使用 cocoasudo,这会为每个调用弹出一个提示。
osascript 解决方案似乎效果更好,但我需要对其进行调整以使用涉及包含空格的路径的命令。
#!/bin/sh
export bar=""
for i in "$@"; do export bar="$bar '${i}'";done
osascript -e "do shell script \"$bar\" with administrator privileges"
进行以下操作,在此示例中,我将创建一个文件夹 /var/lock 并将您的权限设置为 777:
String[] command = {
"osascript",
"-e",
"do shell script \"mkdir -p /var/lock && chmod 777 /var/lock\" with administrator privileges" };
Runtime runtime = Runtime.getRuntime();
try {
Process process = runtime.exec(command);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null)
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
在 linux 上也许你可以用 gksudo 做这个,但我没有测试它,在我去测试并在这里发布结果之后。
gksudo
是 GTK+ 版本的sudo
.
你可以使用这个克隆,特别是对于 OS X。
按照ZJR 的回答,我已经把它变成了 automator,所以你可以将它用作服务或其他任何东西:
on run {input, parameters}
do shell script "sudo open \"" & (POSIX path of input as string) & "\"" with administrator privileges
return input
end run
或者,也许您只是认为他的答案已经过时并且仍然想要一个 AppleScript,只需在 Script Editor 中编写这一行:
do shell script "[[your command]]" with administrator privileges
然后您可以将其制作成一个应用程序并将其用作服务或其他任何东西。
这些答案中似乎有很多错误的信息。为了节省其他人一些时间,我发布了我自己的发现:
首先,就像问题的海报一样,我也有需要从 Java应用程序中提升权限的情况。
我把它分成两个脚本。第一个脚本是使用一些命令行参数从 Java 执行的。第二个脚本执行需要 root 权限的所有步骤。这个想法当然是在第一个脚本中使用 cocoasudo 以 root 权限执行第二个脚本。
我已经通过大量登录到单独的文件确认这些脚本确实符合我的预期。当从命令行手动启动(当然具有普通用户权限)时,它们工作正常。
从 Java 应用程序启动时,我确实收到了 cocoasudo 提示,但没有任何反应。甚至没有出现第二个脚本的第一个日志输出。
当我将第一个脚本更改为使用 osascript 时,再次确认就脚本而言一切都是正确的,当它从 Java 中运行时,我什至没有得到提示。
这一切都在 OS X Mountain Lion 上。好像 Apple 构建了一些安全防护措施,以防止在 Java 中以 root 权限执行脚本。
由于 cocoasudo 本身实际运行,我倾向于认为解决方案是编写类似于 cocoasudo 的代码,但使用 Cocoa API 调用执行所有其余所需的操作。然后也可以对其进行代码签名。
如果您使用的是终端,则只需使用“ sudo
”代替,它将在终端本身提示用户密码(与gksudo
我认为使用图形弹出窗口相反)。Sudo 适用于 Linux 和 OS X。