交互式Shell可可应用程序(NSTask)

时间:2012-08-21 21:18:43

标签: macos cocoa nstask

我试图找出在提示时如何将输入传递给NSTask。

示例:

我喜欢

kinit username@DOMAIN

我收到“输入密码”提示。我希望能够为该NSTask提供密码。

有谁知道怎么做? (基本上通过可可应用程序自动化流程。)

谢谢!

1 个答案:

答案 0 :(得分:2)

通常,命令行应用程序通过标准输入从命令行读取输入。 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

  

- 密码文件的文件名=

     

从文件名的第一行读取密码。如果文件名是STDIN,则将从标准输入中读取密码。

本手册提供了第三种解决方案: 提供--password-file=STDIN作为NSTask的参数,并且没有密码提示。这样可以简化通过NSPipe提供密码的过程,因此您无需在标准输出上等待密码提示。

结论:使用第三种解决方案时更容易:

  1. 使用--password-file=STDIN参数
  2. 配置您的任务
  3. 创建NSPipe
  4. 将其用作任务的标准输入
  5. 启动任务
  6. 通过[pipe fileHandleForWriting](NSFileHandle)将密码数据写入管道