【问题标题】:Interactive Shell Cocoa Application (NSTask)交互式 Shell Cocoa 应用程序 (NSTask)
【发布时间】:2012-08-17 06:58:12
【问题描述】:

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

例子:

我会做类似的事情

kinit username@DOMAIN

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

有人知道怎么做吗? (基本上是通过一个可可应用程序自动化这个过程)。

谢谢!

【问题讨论】:

    标签: macos cocoa nstask


    【解决方案1】:

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

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

    结论:使用第三种解决方案时要容易得多:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-28
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      相关资源
      最近更新 更多