たとえば、ジェイルブレイクされた iPhone で「ifconfig en0 down」を実行するには、root 権限で実行する必要があります。
私のアプリケーションはcydiaでインストールされ、ルート権限で実行されましたが、同じ権限でコマンドラインツールを呼び出す方法がありません。これらは私が試した差分方法です:
1.calling system("ifconfig en0 down"); -> xcode のコンソールに「許可が拒否されました」という通知が表示されました。
2. NSTask を使用して ifconfig を直接実行すると、同じ問題が発生しました (mac osx フレームワークから NSTask.h ファイルをコピーしたところ、動作しました!)。
3. NSTask を使用して、インタラクティブなパスワードを必要とする bash スクリプトで「/bin/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...
もう 1 つの問題は、NSTask が終了する前に、フォアグラウンド プロセスがフリーズし、アプリケーションをまったく操作できないことです。
ルートユーザーのパスワードを入力せずにコマンドラインツールとやり取りできるvisudoという名前の別のコマンドラインツールを見つけましたが、すべてがコードを通過する必要があるため、この方法を試したくありません。
私が知りたいのは、NSTask によって作成されたプロセスと対話し、root 権限で make を実行する方法だけです。または、コマンド ライン ツールをすべてプログラムで root 権限で実行する方法はありますか?
どうもありがとう :)