0

如何将输出保存system("openssl enc -aes-128-cbc -k secret -P -md sha1 > FILENAME")到文件中。

我尝试了以下方法:

NSArray *paths = NSSearchPathForDirectoriesInDomains

(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *fileName = [NSString stringWithFormat:@"%@/textfile.txt",

                      documentsDirectory];

NSString *str=[NSString stringWithFormat:@"openssl enc -aes-128-cbc -k secret -P -md sha1 > %s",[fileName UTF8String]];
NSLog(@"AES Key is %@",str);
system([str UTF8String]);

NSString *strAES = [NSString stringWithContentsOfFile:fileName encoding:nil error:nil];
NSLog(@"strAES Key is %@",strAES);

NSString *strAESKey=[[[[strAES componentsSeparatedByString:@"\n"] objectAtIndex:1] componentsSeparatedByString:@"="] objectAtIndex:1];
NSLog(@"strAESKey Key is %@",strAESKey);

// NSString *content = @"One\nTwo\nThree\nFour\nFive";
  [str writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];`

我哪里错了?

system()函数将输出发送到控制台,但由于 iPhone 没有控制台,我需要将输出重定向到文本文件并从文件中获取密钥以将其用于加密/解密。

4

1 回答 1

0

首先:请注意,我认为您不能system(3)在未越狱的 iOS 上使用。但我不确定,所以我将解释如何做到这一点:

这有点棘手。

要实现它,您必须知道每个进程都使用三个文件描述符打开:一个用于读取(stdin用于标准输入)和两个用于写入(stdout用于标准输出和stderr标准错误输出)。它们的 fd 编号为 0 ( stdin)、1 ( stdout) 和 2 ( stderr)。

要将标准输出或标准错误从程序重定向到文件,您必须执行以下操作:

  • 首先,fork(2)过程。在父进程中waitpid(2)为子进程。
  • 在子进程中:
    • 重新打开 ( freopen(3))stdoutstderr转到您希望将输出重定向的文件。
    • 用来execve(2)执行你要调用的程序
    • 当命令终止时,父进程会得到一个 SIGCHLD 并且waitpid(2)应该返回

括号中的数字描述了man 2 waitpid该函数的手册页(例如)中的章节。

希望这会有所帮助,如果您有更多问题,请询问:-)

更新:由于 OP 只想获取输出,而不是具体到文件中,您可以使用popen(3)

int status;
char value[1024];
FILE *fp = popen("openssl enc -aes-128-cbc -k secret -P -md sha1", "r");

if (fp == NULL) exit(1); // handle error

while (fgets(value, 1024, fp) != NULL) {
  printf("Value: %s", value);
}

status = pclose(fp);
if (status == -1) {
  /* Error reported by pclose() */
}
else {
  /* Use macros described under wait() to inspect `status' in order
   to determine success/failure of command executed by popen() */
}
于 2013-02-07T14:07:22.873 回答