2016-02-17 58 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支持。