我和你有同样的问题,需要它用于 MacOs X 的 OpenVPN 管理器应用程序。你的解决方案远非最佳,因为你为每个设置 setuid root 的人打开了 openvpn 二进制文件。这是一个安全漏洞,应该避免,因为当您使用 smjobbless 助手时,这是完全没有必要的。这个助手以 root 身份运行,可以为你做任何你想做的事情,并且具有管理权限,所以你可以通过这个助手启动 openvpn,而无需在 openvpn 二进制文件上设置 setuid root。
Apple 将此过程设计为只有您的应用程序,即主应用程序,才能与此助手通信,因为您的主应用程序和您的助手使用您的开发人员证书进行签名。任何恶意 App 都无法使用此助手。
当您查看 Nathans 代码时,您会看到他设法将消息发送给该助手并从该助手那里获得答案。在他的示例中,有类似“Hey there Helper App”之类的东西,答案是“Hey there Host App”。
因此,要从中获得有用的信息,您只需向帮助应用程序发送命令,在帮助程序端提取这些命令并在帮助应用程序以提升的权限运行时以提升的权限启动它们。
看看 Nathans 代码,有类似的 sty(在 smjobblessappcontroller.m 中):
xpc_object_t message = xpc_dictionary_create(NULL, NULL, 0);
const char* request = "openvpn --config OpenvpnConnection.ovpn";
xpc_dictionary_set_string(message, "request", request);
[self appendLog:[NSString stringWithFormat:@"Sending request: %s", request]];
xpc_connection_send_message_with_reply(connection, message, dispatch_get_main_queue(), ^(xpc_object_t event) {
const char* response = xpc_dictionary_get_string(event, "reply");
[self appendLog:[NSString stringWithFormat:@"Received response: %s.", response]];
});
有了这个,您将 openvpn 命令发送到您的助手应用程序。您只需在助手端提取此命令即可以提升的权限启动该进程。
查看 smjobblesshelper.c 并做某事(在 __XPC_Peer_Event_Handler else 分支中):
const char *response = xpc_dictionary_get_string(event, "request");
在字符串响应中,你有你的 openvpn 命令,现在简单地启动它:
system(response);
就是这样,这与提升的特权有关。现在,您可以在您的应用程序中使用它,或者在您的主应用程序的 IBAction 按钮中使用它,以便在每次用户单击此按钮时根据需要启动 openvpn 连接。