我似乎在理解 Cocoa 中的 NSTask 时遇到了一些困难。我要启动的应用程序是 openSSL。目前,我可以发送信息(启动路径、参数等),并且还可以使用 NSPipe 获得响应。我需要做的是响应应用程序要求的输入请求。使用以下代码,我可以发送并读取文件中的响应:
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: launchPath];
[task setArguments: arguments];
[task setCurrentDirectoryPath:dir];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [file readDataToEndOfFile];
NSString *response = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
启动 NSTask 后,我需要提供域名、国家/地区等信息。我提出问题的原因是我需要能够使用 openSSL 生成证书签名请求并将其与一些其他数据,传输到服务器。上面的代码没有损坏,我只是不确定如何发送该输入。
此外,如果有人在 Cocoa/ObjC 中使用过某种 openSSL 实现,并且认为这将是比使用 NSTask 更好的选择,我也对此完全持开放态度。
提前致谢。
最佳答案
并不是说有人在看这个,但如果你在看并且还不知道答案,我找到了解决方案,但最终使用了不同的方法。我不会发送额外的输入,而是只传递 -subj 参数。然而,我最初提出的问题的解决方案如下:
NSTask *task = [[NSTask alloc] init];
NSString *tmpdir=NSTemporaryDirectory();
[task setCurrentDirectoryPath:tmpdir];
[task setLaunchPath:@"/usr/bin/openssl"];
NSArray *sslarguments=@[@"req",@"-nodes",@"-newkey",@"rsa:2048",@"-keyout",@"myserver.key",@"-out",@"server.csr"];
[task setArguments:sslarguments];
NSPipe * in = [NSPipe pipe];
[task setStandardInput:in];
NSData *data=[@"GB\nYorks\n\nYork\SimuplanSL\nIT\nsomeone@simuplan.com" dataUsingEncoding:NSUTF8StringEncoding];
[task launch];
[[in fileHandleForWriting] writeData:data];
[task waitUntilExit];
我只需写入临时目录中的文件并通过输入管道提供它。
关于objective-c - NSTask - 响应来自 OpenSSL 的输入请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17702162/