我正在用Java设计一个小软件。我不知道我正在做什么的术语/定义,但我提示从Java到终端的命令。像这样:
Process process = Runtime.getRuntime().exec("command");
我之前在Linux中已经这样做了,我使用gksudo
来获取需要root密码的命令。
OS X中是否有gksudo
?任何要求root密码的图形弹出窗口?
答案 0 :(得分:19)
使用AppleScript shell脚本可以更好地编写自己的脚本:
#!/bin/sh
osascript -e "do shell script \"$*\" with administrator privileges"
cocoasudo
看起来更美观,但已经部署了。
答案 1 :(得分:8)
这也看起来很有希望:cocoasudo
它使用OSX本机授权服务API:
对于基于Mac OS X Cocoa的应用程序,可以通过Authorization Services API提供sudo的附带功能。使用API可以提示用户输入用户名和密码,以请求升级权限。
...
对于那种情况,我写了一个小实用程序,我称之为cocoasudo。使用cocoasudo的方式与使用sudo的方式大致相同。但是,不会在终端窗口中提示用户输入密码,而是通过授权服务API获取对话框提示。
答案 2 :(得分:5)
如果您正在运行调用其他命令的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"
答案 3 :(得分:4)
制作如下,在这个例子中我去创建一个文件夹/ 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来做这个,但是在我测试并在这里发布结果之后我没有测试它。
答案 4 :(得分:2)
gksudo
是sudo
的GTK +版本。
您可以使用this clone,尤其是OS X。
答案 5 :(得分:2)
关注ZJR's answer后,我将其变为自动机,因此您可以将其用作服务或其他任何内容:
on run {input, parameters}
do shell script "sudo open \"" & (POSIX path of input as string) & "\"" with administrator privileges
return input
end run
或者,也许你只是觉得他的答案已经过时但仍然想要一个AppleScript,只需在脚本编辑器中写下这一行:
do shell script "[[your command]]" with administrator privileges
然后您可以make into an app将其用作服务或其他任何内容。
答案 6 :(得分:1)
应该使用本机OS X授权服务,而不是查看sudo和/或图形界面。
价:
[我知道这是一个迟到的答案......]
答案 7 :(得分:0)
这些答案中似乎有很多错误的信息。为了节省其他人一些时间,我发表了自己的发现:
首先,就像问题的海报一样,我也需要从Java 应用程序中提升权限。
我把它分成了两个脚本。第一个脚本是从Java执行的,带有一些命令行参数。第二个脚本执行需要root权限的所有步骤。这个想法当然是在第一个脚本中使用cocoasudo以root权限执行第二个脚本。
我已通过广泛记录到单独的文件中确认脚本确实按照我的意图行事。当从命令行手动启动(当然具有普通用户权限)时,它们工作正常。
从Java应用程序启动时,我确实得到了cocoasudo提示,但没有任何反应。甚至不会显示第二个脚本的第一个日志记录输出。
当我更改第一个脚本以使用osascript时,再次确认一切正确,只要脚本运行,我甚至没有从Java内部运行时得到提示。
这是OS X Mountain Lion的全部内容。好像Apple构建了一些安全防护措施,可防止脚本在Java中以root权限执行。
由于cocoasudo本身实际运行,我倾向于认为解决方案是编写类似于cocoasudo的代码,但使用Cocoa API调用执行所有其他所需操作。然后也可以对其进行代码签名。
答案 8 :(得分:-3)
如果您正在使用终端,那么只需使用“sudo
”,这将在终端本身提示用户的密码(而不是我认为使用图形弹出窗口的gksudo
) 。 Sudo适用于Linux和OS X.