我正在用Java设计一个小软件。我不知道我正在做什么术语/定义,但我正在从Java向终端提示命令。就像这样:
Process process = Runtime.getRuntime().exec("command");
我之前在Linux中做过这个操作,而且我使用gksudo
来运行需要root密码的命令。
在OS X中是否有类似gksudo
的命令呢?有没有弹出图形界面要求输入root密码的功能?
我正在用Java设计一个小软件。我不知道我正在做什么术语/定义,但我正在从Java向终端提示命令。就像这样:
Process process = Runtime.getRuntime().exec("command");
我之前在Linux中做过这个操作,而且我使用gksudo
来运行需要root密码的命令。
在OS X中是否有类似gksudo
的命令呢?有没有弹出图形界面要求输入root密码的功能?
你可以使用AppleScript的shell脚本来编写自己的脚本,或多或少可以实现。
#!/bin/sh
osascript -e "do shell script \"$*\" with administrator privileges"
cocoasudo
看起来更加美观,但这已经被部署了。
cocoasudo
。它使用了OSX本地的Authorization Services API。对于基于Cocoa的Mac OS X应用程序,有类似于sudo的功能,可以通过Authorization Services API提供。使用该API允许您提示用户输入用户名和密码,请求升级特权的权限。对于这种情况,我编写了一个小实用程序,称为cocoasudo。使用cocoasudo的方式与使用sudo的方式非常相似。但是,与在终端窗口中提示用户输入密码不同,他们将通过Authorization Services API获得对话框提示。./cocoasudo systemsetup
并得到了图形提示,但是在输入密码后,systemsetup
仍然认为我没有使用 sudo
,因为它抱怨说:“您需要管理员访问权限才能运行此工具...退出!” - h__#!/bin/sh
export bar=""
for i in "$@"; do export bar="$bar '${i}'";done
osascript -e "do shell script \"$bar\" with administrator privileges"
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来完成这个操作,但我还没有测试过。等我测试完后,会在这里发布结果。
on run {input, parameters}
do shell script "sudo open \"" & (POSIX path of input as string) & "\"" with administrator privileges
return input
end run
do shell script "[[your command]]" with administrator privileges
应该使用本地的OS X授权服务,而不是查看sudo和/或其图形界面。
参考:
[我知道这是一个晚回答...]
这些答案中似乎有很多错误的信息。为了节省其他人的时间,我发布了自己的发现:
首先,像问题的发布者一样,我也有需要在Java应用程序内提升权限的情况。
我将其拆分为两个脚本。第一个脚本使用一些命令行参数从Java中执行。第二个脚本执行所有需要root权限的步骤。当然,想法是在第一个脚本中使用cocoasudo以root权限执行第二个脚本。
通过将日志记录到单独的文件中进行广泛的确认,我确认脚本确实做到了我想要的事情。当手动从命令行启动时,它们可以正常工作(当然是使用普通用户权限)。
当从Java应用程序启动时,我确实会得到cocoasudo提示,但什么也不会发生。甚至第二个脚本的第一个日志输出都没有出现。
当我将第一个脚本更改为使用osascript时,再次确认脚本的一切都正确无误,当它从Java内部运行时,我甚至没有得到提示。
这全部发生在OS X Mountain Lion上。好像苹果内置了一些安全保护措施,以防止从Java内部以root权限执行脚本。
由于cocoasudo本身实际上是可以运行的,我倾向于认为解决方案是编写类似于cocoasudo的代码,但使用Cocoa API调用执行所有其他所需操作。然后也可以对其进行代码签名。
sudo
”即可,它将在终端本身中提示用户输入密码(而不是gksudo
,我认为它使用图形弹出窗口)。Sudo适用于Linux和OS X。