8

プロンプトが表示されたときに入力を NSTask に渡す方法を見つけようとしています。

例:

私は次のようなことをします

kinit username@DOMAIN

「パスワードを入力してください」というプロンプトが表示されます。その NSTask にパスワードを提供できるようにしたいです。

誰もこれを行う方法を知っていますか? (基本的にココア アプリを介してプロセスを自動化します)。

ありがとう!

4

1 に答える 1

3

通常、コマンド ライン アプリケーションは、標準入力を介してコマンド ラインから入力を読み取ります。NSTask は、またはsetStandardInput:を設定する方法を提供します。NSFileHandleNSPipe

次のようなものを試すことができます:

NSTask *task = // Configure your task

NSPipe *inPipe = [NSPipe pipe];
[task setStandardInput:inPipe];

NSPipe *outPipe = [NSPipe pipe];
[task setStandardOutput:outPipe];

NSFileHandle *writer = [inPipe fileHandleForWriting];
NSFileHandle *reader = [outPipe fileHandleForReading];
[task launch]

//Wait for the password prompt on reader [1]
NSData *passwordData = //get data from NSString or NSFile etc.
[writer writeData:passwordData];

リーダー NSFileHandle でデータを待機するメソッドについては、NSFileHandleを参照してください。

ただし、これは、コマンド ライン ツールでプロンプトを使用する場合にこの問題を解決する一般的な方法を示す、テストされていない例にすぎません。特定の問題については、別の解決策があるかもしれません。このコマンドは、任意のファイルからパスワードを読み取るために使用できるkinit引数を許可します。--password-file=<filename>

からman kinit:

--password-file=ファイル名

ファイル名の最初の行からパスワードを読み取ります。ファイル名が STDIN の場合、パスワードは標準入力から読み取られます。

マニュアルでは 3 番目の解決策を 提供--password-file=STDINしています。NSTask に引数として指定すると、パスワード プロンプトは表示されません。これにより、NSPipe を介してパスワードを提供するプロセスが容易になるため、標準出力でパスワード プロンプトを待つ必要がなくなります。

結論: 3 番目のソリューションを使用すると、はるかに簡単になります。

  1. --password-file=STDINパラメータを使用してタスクを構成します
  2. NSPipe を作成する
  3. タスクの標準入力として使用します
  4. タスクを起動する
  5. [pipe fileHandleForWriting] (NSFileHandle) を介してパスワード データをパイプに書き込みます。
于 2014-11-16T13:08:53.523 に答える