有没有适用于Mac OS X的图形界面"Sudo"?

26

我正在用Java设计一个小软件。我不知道我正在做什么术语/定义,但我正在从Java向终端提示命令。就像这样:

Process process = Runtime.getRuntime().exec("command");

我之前在Linux中做过这个操作,而且我使用gksudo来运行需要root密码的命令。

在OS X中是否有类似gksudo的命令呢?有没有弹出图形界面要求输入root密码的功能?


1
当我打开MAMP时,会要求我输入密码。或者当我安装一个pkg时...在OS X中,那个弹出框叫什么? - user89862
9个回答

25

你可以使用AppleScript的shell脚本来编写自己的脚本,或多或少可以实现。

#!/bin/sh
osascript -e "do shell script \"$*\" with administrator privileges"

cocoasudo 看起来更加美观,但这已经被部署了。


2
有没有办法在调用之间记住输入的密码?我需要连续多次调用这样的脚本,并且不想要求用户多次输入他们的密码。 - Kevin Wong
1
这个不再起作用了。检查我的答案以获取更新或更多选项。随意更新你的,@ZJR!;P - cregox

7
这看起来也很有前途: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__

6
我发现如果您运行调用其他命令的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"

2
太棒了。唯一的缺点是对话框上写着“osascript想要进行更改”,这可能会让用户感到困惑,因为她可能不知道osascript是什么。 - gregschlom

6
在此示例中,我将创建一个名为 /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来完成这个操作,但我还没有测试过。等我测试完后,会在这里发布结果。


这正是我所寻找的,刚刚为此问题花费了数小时...谢谢你的帮助。 - antonio081014
谢谢你的解决方案,是否有可能将“osascript”从消息“osascript想要进行更改”中替换掉? - Arash
还有没有一种方法可以为根凭据创建会话,这样它就不会每次都要求输入用户名和密码? - Arash
抱歉 @Arash,但我不知道你的两个问题的答案 =/ - ademar111190

3
根据ZJR的回答,我已经将其转化为自动化程序,因此您可以将其用作服务或其他用途:
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

然后您可以将其制作成应用程序并将其用作服务或其他用途。

2

gksudosudo的GTK+版本。

你可以使用这个克隆版本,特别适用于OS X操作系统。


1

0

这些答案中似乎有很多错误的信息。为了节省其他人的时间,我发布了自己的发现:

首先,像问题的发布者一样,我也有需要在Java应用程序内提升权限的情况。

我将其拆分为两个脚本。第一个脚本使用一些命令行参数从Java中执行。第二个脚本执行所有需要root权限的步骤。当然,想法是在第一个脚本中使用cocoasudo以root权限执行第二个脚本。

通过将日志记录到单独的文件中进行广泛的确认,我确认脚本确实做到了我想要的事情。当手动从命令行启动时,它们可以正常工作(当然是使用普通用户权限)。

当从Java应用程序启动时,我确实会得到cocoasudo提示,但什么也不会发生。甚至第二个脚本的第一个日志输出都没有出现。

当我将第一个脚本更改为使用osascript时,再次确认脚本的一切都正确无误,当它从Java内部运行时,我甚至没有得到提示。

这全部发生在OS X Mountain Lion上。好像苹果内置了一些安全保护措施,以防止从Java内部以root权限执行脚本。

由于cocoasudo本身实际上是可以运行的,我倾向于认为解决方案是编写类似于cocoasudo的代码,但使用Cocoa API调用执行所有其他所需操作。然后也可以对其进行代码签名。


-5
如果您正在使用终端,则只需使用“sudo”即可,它将在终端本身中提示用户输入密码(而不是gksudo,我认为它使用图形弹出窗口)。Sudo适用于Linux和OS X。

1
它应该是图形化的... =) - user89862
1
谁蠢到给这个点了踩?当我回答问题时,问题中根本没有出现“图形”这个词。即使它不完全符合原始发布者的要求,它仍然是一个有效的答案。 - Adam Batkin
1
问题明确要求sudo的图形版本(第4个单词)。 - 64bit_twitchyliquid
@64bit_twitchyliquid 但是当我回答这个问题时它并没有起作用。此外,我的答案并不是错误的,只是没有完全回答这个问题(也就是说,它可能仍然对其他人有帮助)。 - Adam Batkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接