我正在努力学习 obj-C 并且可以使用一些帮助。我正在编写一个“命令行工具”来创建加密的 DMG,然后安全地删除包含的文件。当 hdiutil 创建 DMG 时,它会要求提供加密密码,我正在尝试将此密码从 bin/echo 传输到 hdiutil。
DMG 是按预期创建的,但是当我尝试安装它时,密码不被接受。我尝试使用空白密码和末尾的额外空间进行挂载。
当我 NSLog 管道中的值时,它看起来是正确的,但这可能是因为我刚刚读取了前 4 个字符。我猜密码中添加了一些额外的字符,但我不知道为什么和什么。
两个问题 1:如何将“正确”值作为密码从 NSTask passwordCmd 传送到 NSTask backupCmd?
2:我如何 NSLog 与传递给 [backupCmd setStandardInput:pipe] 的管道中的值完全相同
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSTask *passwordCmd = [NSTask new];
NSTask *backupCmd = [NSTask new];
NSPipe *pipe;
pipe = [NSPipe pipe];
// Enter password by calling echo with a NStask
[passwordCmd setLaunchPath:@"/bin/echo"];
[passwordCmd setStandardOutput:pipe]; // write to pipe
[passwordCmd setArguments: [NSArray arrayWithObjects: @"test", nil]];
[passwordCmd launch];
[passwordCmd waitUntilExit];
// Log the value of the pipe for debugging
NSData *output = [[pipe fileHandleForReading] readDataOfLength:4];
NSString *string = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding];
NSLog(@"'%@'", string);
// Create a encrypted DMG based on a folder
[backupCmd setLaunchPath:@"/usr/bin/hdiutil"];
[backupCmd setCurrentDirectoryPath:@"/Volumes/Macintosh HD/Users/kalle/Desktop/test/"];
[backupCmd setArguments:[NSArray arrayWithObjects:@"create",@"-format",@"UDZO",@"-srcfolder",@"backup",@"/Volumes/Macintosh HD/Users/kalle/Desktop/backup.dmg",@"-encryption",@"AES-256",@"-stdinpass",@"-quiet",nil]];
[backupCmd setStandardInput:pipe]; // read from pipe
[backupCmd launch];
[backupCmd waitUntilExit];
// Do some more stuff...
}
return 0;
}
任何帮助深表感谢!