我试图弄清楚如何在提示时将输入传递给NSTask。

例子:

我做类似的事情

kinit username@DOMAIN

并出现“输入密码”提示。我希望能够为该NSTask提供密码。

有谁知道如何做到这一点? (通过 cocoa 应用程序基本实现流程自动化)。

谢谢!

最佳答案

通常,命令行应用程序通过标准输入从命令行读取输入。 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作为NSTask的参数,并且不会出现密码提示。这简化了通过NSPipe提供密码的过程,因此您无需等待标准输出以输入密码提示。

结论:当使用第三个解决方案时,它要容易得多:
  • 使用--password-file=STDIN参数
  • 配置任务
  • 创建一个NSPipe
  • 用作任务
  • 的标准输入
  • 启动任务
  • 通过[pipe fileHandleForWriting](NSFileHandle)将密码数据写入管道中
  • 关于macos - 交互式 shell cocoa 应用程序(NSTask),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12063193/

    10-13 06:34