5

你好,SO的好人,

我正在编写一个 shell 脚本,它将更改某些系统首选项,例如主机名 (scutil --set HostName),这需要权限提升才能处理。该脚本将在Platypus生成的应用程序中运行。

一旦我的脚本调用 scutil(例如),我当然会得到安全服务器提示我进行身份验证。

查看安全手册页,有两个标志让我感兴趣:

security authorize
security execute-with-privileges

同样从手册页我得到一个例子:

security -q authorize -uew my-right | security -q authorize -i my-right

"授权权限并将其传递给另一个命令,作为向 shell 脚本添加授权的一种方式。 "

但是,我没有得到我想要的东西,我想我只是不明白如何正确使用它。有没有人有任何额外的见解?当我搜索时,我发现了什么,让我变得不聪明。我很感激帮助:

  1. 让脚本提示输入凭据一次,以运行提升的整个脚本。
  2. 提示一次凭据,以便这些可以发送到脚本内的各个命令,这需要提升。

运行带有 Platypus 标志Run with Administrator Privileges的脚本仍然会以 $EUID 不为 0(零)的方式运行脚本。

我想,这意味着脚本以某种方式被提升,但不是以 root 身份运行。此提升(如果有效)似乎不足以调用scutil --set HostName x,因为该命令仍要求提供凭据。

如果需要进一步澄清,请大声疾呼!

提前致谢。

最好的问候,特德

4

1 回答 1

1

我不熟悉使用安全命令行工具或鸭嘴兽,但查看安全手册页,它似乎与核心基金会的 Apple 编程接口相匹配,所以我可以从这个角度解释一下,假设命令行命令很可能使用相同的 Core Foundation 框架。

函数 executeWithPrivileges 现在已被弃用,为了让程序执行需要提升的功能,程序必须将提升的操作分解到另一个在 launchd 注册的“帮助”程序中。launchd 负责处理帮助应用程序的实际执行和提升。

您的主应用程序也使用助手应用程序签名,因此只有它可以请求助手应用程序运行。

您可以在此处的 SMJobBless 应用程序文档中阅读更多相关信息。

尽管 SMJobBless 是用 Objective-C 编写的,而 helper 是用 C 语言编写的,但您也许可以使用 Platypus 来代替使用脚本,但这不是我自己尝试过的,所以您必须进行试验。

正如您从文档中看到的那样,调用助手应用程序是使用用于识别助手程序的 URI(例如 com.apple.calculator)完成的,因此它需要位于应用程序包中。

希望有帮助。

于 2013-08-15T11:00:35.720 回答