我需要在我越狱的 iPhone 上运行一些东西,例如“ifconfig en0 down”,它需要以 root 权限运行。
尽管我的应用程序是使用 cydia 安装并在 root 权限下运行,但我没有任何方法可以调用具有相同权限的命令行工具,这些是我尝试过的不同方式:
1.calling system("ifconfig en0 down"); -> 我在 xcode 的控制台中收到“权限被拒绝”通知;
2.使用NSTask直接运行ifconfig,遇到同样的问题(我从mac osx框架复制了NSTask.h文件,它可以工作!)。
3. 使用 NSTask 运行“/bin/bash”和一个需要和密码交互的 bash 脚本,但是当我尝试使用 NSPipe 与任务交互时,它根本没有响应。
一些代码会是这样的:
NSPipe *p1 = [NSPipe pipe];
[self.task setStandardOutput:p1];
self.output= [p1 fileHandleForReading];
NSPipe *p2 = [NSPipe pipe];
[self.task setStandardInput:p2];
self.input = [p2 fileHandleForWriting];
[self.task launch];
NSLog(@"Launched...");
sleep(1);
[self.input writeData:[@"alpine" dataUsingEncoding:NSASCIIStringEncoding]];
NSLog(@"Password wrote...");
我从下面的 xcode 设备控制台收到通知...
Jun 25 22:10:30 unknown Demo[653] <Warning>: Launched...
Jun 25 22:10:30 unknown UIKitApplication:com.newland.Demo[0xefba][653] <Notice>: We trust you have received the usual lecture from the local System
Jun 25 22:10:30 unknown UIKitApplication:com.newland.Demo[0xefba][653] <Notice>: Administrator. It usually boils down to these three things:
Jun 25 22:10:30 unknown UIKitApplication:com.newland.Demo[0xefba][653] <Notice>: #1) Respect the privacy of others.
Jun 25 22:10:30 unknown UIKitApplication:com.newland.Demo[0xefba][653] <Notice>: #2) Think before you type.
Jun 25 22:10:30 unknown UIKitApplication:com.newland.Demo[0xefba][653] <Notice>: #3) With great power comes great responsibility.
Jun 25 22:10:30 unknown UIKitApplication:com.newland.Demo[0xefba][653] <Notice>: Password:
Jun 25 22:10:31 unknown Demo[653] <Warning>: Password wrote...
另一个问题是,在 NSTask 退出之前,前台进程被冻结,我根本无法操作我的应用程序。
我发现了另一个名为 visudo 的命令行工具,它可以让我在不输入 root 用户密码的情况下与命令行工具进行交互,但我不想尝试这种方式,因为我需要一切都通过代码。
我想知道的是如何与 NSTask 创建的进程进行交互,并使用 root 权限运行 make,或者有什么方法可以以 root 权限运行命令行工具?
非常感谢 :)