FILENAME") into a file. Я пробовал следующее: NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask,"> FILENAME") into a file. Я пробовал следующее: NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask,"> FILENAME") into a file. Я пробовал следующее: NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask," />

Как захватить стандартный вывод процесса, запущенного системой ()

How do I save the output of system("openssl enc -aes-128-cbc -k secret -P -md sha1 > FILENAME") into a file.

Я пробовал следующее:

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 не имеет консоли, мне нужно перенаправить вывод в текстовый файл и получить ключ из файла, чтобы использовать его для шифрования/дешифрования.

0
nl ja de
Привет, добро пожаловать в SO. Если вы можете дать более подробную информацию о том, с какими проблемами вы столкнулись, или каким образом ваше решение выше не работает, тогда вы, вероятно, получите более конструктивную помощь /
добавлено автор Vicky, источник

1 ответы

Прежде всего: имейте в виду, я не думаю, что вы можете использовать систему (3) для неизолированной iOS. Но я не уверен, поэтому я объясню, как это сделать:

Это немного сложно.

Чтобы добиться этого, вы должны знать, что каждый процесс открывается с тремя файловыми дескрипторами: один для чтения ( stdin для стандартного ввода) и два для записи ( stdout для стандартного вывода и stderr для стандартного вывода ошибок). Они имеют число fd 0 ( stdin ), 1 ( stdout ) и 2 ( stderr ).

Чтобы перенаправить стандартный вывод или стандартную ошибку в файл из программы, вы должны сделать следующее:

  • first, fork(2) the process. In the parent process waitpid(2) for the child prozess.
  • In the child process:
    • reopen (freopen(3)) stdout and stderr to the file you want the output to be redirected.
    • use execve(2) to execute the program you want to call
    • when the command terminates, the parent gets a SIGCHLD and waitpid(2) should return

Число в скобках описывает главу на страницах руководства ( man 2 waitpid , например.) Для функции.

Надеюсь, что это поможет, если у вас есть еще вопросы, спросите :-)

Update: Since the OP just wants to get the output and not specificly into a file, you can use 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() */
}
0
добавлено
1. Спасибо, вы правы, я отредактировал свой ответ, чтобы быть более конкретным. 2. Если вы просто хотите прочитать вывод, правильным будет сделать popen() . Если вы хотите перенаправить вывод в файл, вы должны повторно открыть stdout.
добавлено автор ckruse, источник
Я редактировал пример для popen() .
добавлено автор ckruse, источник
Это то, о чем я говорил. Из-за песочницы вы не можете выполнять команды на устройстве. Вы должны использовать OpenSSL API ( openssl.org/docs/ssl/ssl.html )
1. В jailbroken iOS есть оболочка, поэтому вы можете использовать системную функцию. 2. Почему бы просто не вскрыть его? Тогда вам не придется иметь дело со всеми этими утомительными вызовами функций.
добавлено автор user529758, источник
Когда я выполняю нижнюю строку system ("openssl enc -aes-128-cbc -k secret -P -md sha1"); Он выводит вывод на консоль Выход: salt = 0879D963A2DF15F9 key = 26287A322BE333C6A5E44256791AFEDE iv = 23715CAFB431BE252BD2AB20D56B9C42 Как я могу получить эти данные с консоли? Могу ли вы, пожалуйста, дать мне образец для использования popen ()?
добавлено автор user2050884, источник
@ckruse Большое спасибо.
добавлено автор user2050884, источник
Привет, снова код не работает для устройства ... но он работает на симуляторе. Может, пожалуйста, помогите мне?
добавлено автор user2050884, источник
Привет, снова код не работает для устройства ** Его не входит в цикл while на устройстве **, но он работает на симуляторе. Может, пожалуйста, помогите мне?
добавлено автор user2050884, источник
Мы использовали библиотеку openssl в нашем проекте и смогли сгенерировать AES-ключ с помощью команды, но не смогли сохранить ключ.
добавлено автор user2050884, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.