2016-02-17 57 views
0

考虑使用命令行应用程序需要在OSX上以root身份运行的第三方SDK。您在Objective C中构建一个Cocoa应用程序,并将其安装在/ root下的“root:wheel”(user:root,group:wheel)所有权下。我已经拥有该文件夹/文件所有权,因为我的安装程序应用程序使用AppleScript提示输入root,然后为此执行chown和chmod。用目标C更新根目录Crontab

那么,Cocoa应用程序更新根的crontab以便第三方命令行应用程序在根环境下运行的首选编程方式是什么?我的意思是,当我运行Cocoa应用程序时,它是否在根目录下运行,因为这是我在安装程序中设置文件所有权的方式?或者,Apple是否以登录用户身份启动它?如果应用程序在根环境下运行,那么我猜想普通的文件I/O将起作用。如果,即使我已经以root身份安装了Cocoa应用程序,它将以登录到笔记本电脑的用户身份运行,那么我需要提升权限以root身份执行该文件I/O。我想这样做,而不必每次都提示进入钥匙串访问。

我创建的曾在applicationDidFinishLaunching类方法如下样品OSX Cocoa应用程序(MyApp.app):

std::ofstream outfile; 

outfile.open("/tmp/test.txt"); 
NSString *sUser = NSUserName(); 
outfile << "\n" << [sUser UTF8String] << "\n"; 

std::ofstream outfile2; 
outfile2.open("/var/at/tabs/root"); 
outfile2 << "\n#DEMO"; 

我然后将其复制到/应用程序和没有chown -R root:wheel /Applications/MyApp.app

当我运行它时,/tmp/test.txt显示“mike”(不像我希望的那样),而/ var/at/tabs/root文件没有附加“#DEMO”。

我想它没有权限,就像我希望的那样。那么,让我的应用程序能够在不提示每次更新/ var/at/tabs/root的情况下,除了在安装期间或者在安装后第一次运行时(如果这不可能) ?

+1

看一看[ServiceManagement Reference](https://developer.apple.com/library/mac/documentation/ServiceManagement/Reference/ServiceManagement_header_reference/)(例如SMJobBless) –

+0

这个Q不是编程相关的,但是管理员相关。基本上,它是“我需要做什么*运行*具有root权限的应用程序?” –

+0

@ AminNegm-Awad我还不确定。我会尝试一些实验,看看我想出了什么,然后添加到这个问题。 – Volomike

回答

0

苹果推荐的方法使用要做到这一点你的代码是:

http://atnan.com/blog/2012/02/29/modern-privileged-helper-tools-using-smjobbless-plus-xpc/

SMJobBless + XPC

这是非常复杂的。您必须创建XPC服务,使用您需要的权限进行安装,以特殊方式安装它,然后将XPC消息发送给它以使其执行特权任务。它还涉及代码签名,以确保正在运行与XPC服务通信的应用程序得到正确授权。

因此,XPC Service将会是更新/ var/at/tabs/root的人。也就是说,除非您以另一种方式来做 - XPC Service会自行检查时钟,以确定何时需要执行某些操作。

另一种途径是利用SUID,尽管这不被Apple支持。