0

看来我在理解 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 更好的选择,那么我也完全愿意接受。

提前致谢。

4

1 回答 1

2

并不是说有人在看这个,但如果你已经知道并且还不知道答案,我找到了解决方案,但最终使用了不同的方法。我不会发送额外的输入,而是只传递 -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];

我只需要写入临时目录中的文件并通过输入管道输入它。

于 2013-07-20T12:38:02.417 回答