Интерактивное приложение Shell Cocoa (NSTask)

Я пытаюсь понять, как передать ввод в NSTask при появлении запроса.

Пример:

я делаю что-то вроде

kinit username@DOMAIN

и я получаю приглашение «введите пароль». Я хочу иметь возможность указать пароль для этого NSTask.

Кто-нибудь знает как это сделать? (В основном автоматизация процесса через приложение какао).

Спасибо!


person user754905    schedule 21.08.2012    source источник


Ответы (1)


Обычно приложения командной строки считывают ввод из командной строки через стандартный ввод. NSTask предоставляет метод setStandardInput: для установки NSFileHandle или NSPipe.

Вы можете попробовать что-то вроде:

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.

Однако это всего лишь непроверенный пример, показывающий общий способ решения этой проблемы при наличии инструментов командной строки с использованием подсказок. Для вашей конкретной проблемы может быть другое решение. Команда kinit допускает аргумент --password-file=<filename>, который можно использовать для чтения пароля из произвольного файла.

От man kinit:

--password-file=имя файла

прочитать пароль из первой строки имени файла. Если имя файла STDIN, пароль будет прочитан со стандартного ввода.

Руководство предлагает третье решение: укажите --password-file=STDIN в качестве аргумента для вашего NSTask, и запрос пароля не будет предлагаться. Это упрощает процесс предоставления пароля через NSPipe, поэтому вам не нужно ждать стандартного вывода запроса пароля.

Вывод: При использовании третьего решения намного проще:

  1. Настройте свою задачу с параметром --password-file=STDIN
  2. Создать NSPipe
  3. Используйте его в качестве стандартного ввода для вашей задачи
  4. запустить задачу
  5. записать данные пароля в канал через [pipe fileHandleForWriting] (NSFileHandle)
person TobiasMende    schedule 16.11.2014