問題描述:使用xcode生成 app后,將它放置/Applications 目錄下,但調(diào)用系統(tǒng)目錄的權(quán)限不足,導(dǎo)致reboot等命令不能執(zhí)行.
解決問題方向: 將app具有root 權(quán)限.
解決方法:
1.suid位,在unix上用于表示文件權(quán)限,用于標(biāo)識其他用戶執(zhí)行該文件時是以文件的所有者來運行.僅對二進制可執(zhí)行文件有效,若該文件屬于root時,當(dāng)其他用戶執(zhí)行文件時,相應(yīng)地也就具有了root權(quán)限.
修改 suid 權(quán)限:
chmod u+s filename 設(shè)置SUID
chmod u-s filename 去掉SUID設(shè)置
設(shè)置了suid位,則文件在原來的x位"x"變成了"s"
#ls -l a.txt
-rwxrwxrwx 777
#chmod 4777 a.txt
-rwsrwxrwx ======>注意s位置
操作:
(1)在項目的main.m文件修改以下代碼:
int main(int argc, char *argv[]) { setuid(0); setgid(0); @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
(2)將打包好的RebootApp.app放在/Applications 目錄下,并將RebootApp.app/RebootApp 的權(quán)限加上suid,并將其所有者改為 root
chmod u+s RebootApp
chown root RebootApp
2. 增加引導(dǎo)程序
在第一步完成后,重啟設(shè)備,發(fā)現(xiàn)一打開應(yīng)用就閃退.后來查資料才知道原因在于用戶打開應(yīng)用時通過SpringBoard來啟動應(yīng)用的中,而iOS在用戶打開應(yīng)用的時候會進行權(quán)限檢測,它如果檢查到將以root運行應(yīng)用程序時就不會執(zhí)行.
解決方法:設(shè)置引導(dǎo)程序,通過引導(dǎo)程序打開應(yīng)用, 就可以眺過SpringBoard的安全檢查,而引導(dǎo)程序是普通用戶權(quán)限,用戶可以直接打開.
操作:
(1) 將設(shè)備里的/Applications/RebootApp.app/RebootApp 文件改名為RebootApp_
(2) 在項目的main.m文件修改以下代碼:
int main(int argc, char *argv[]) { @autoreleasepool { NSString* string = [[NSBundle mainBundle] pathForResource:@"RebootApp_" ofType:nil];//RebootApp_是所要啟動的名字二進制文件名 argv[0] = (char*)[string UTF8String]; execve([string UTF8String], argv, NULL); return 0; } }
(3) 再編譯一次生成RebootApp.app,將RebootApp.app包里的RebootApp 通過ssh放到設(shè)備的 /Applications/RebootApp.app/目錄,重啟設(shè)備,打開應(yīng)用,完成,程序具有root權(quán)限
參考文章:
http://blog.csdn.net/longhuihu/article/details/8907004
http://hi.baidu.com/lm382304817/item/4aa87eaa87c7f2746dd455ad
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。