我试图弄清楚如何在出现提示时将输入传递给 NSTask 。
例子:
我做类似的事情
kinit username@DOMAIN
我收到“输入密码”提示。我希望能够为该 NSTask 提供密码。
有谁知道如何做到这一点?(基本上是通过可可应用程序自动化该过程)。
谢谢!
通常,命令行应用程序通过标准输入从命令行读取输入。NSTask 提供了一种setStandardInput:
设置 aNSFileHandle
或 a的方法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 上等待数据的方法,请参阅NSFileHandle 。
但是,这只是一个未经测试的示例,展示了在使用命令行工具使用提示时解决此问题的一般方法。对于您的具体问题,可能还有另一种解决方案。该kinit
命令允许--password-file=<filename>
使用可用于从任意文件读取密码的参数。
来自man kinit
:
--password-file=文件名
从文件名的第一行读取密码。如果文件名是 STDIN,密码将从标准输入中读取。
该手册提供了第三种解决方案:作为参数
提供--password-file=STDIN
给您的 NSTask 并且不会有密码提示。这简化了通过 NSPipe 提供密码的过程,因此您无需在标准输出上等待密码提示。
结论:使用第三种解决方案时要容易得多:
--password-file=STDIN
使用参数配置您的任务