Нет способа передать всю командную строку в NSTask.
по уважительной причине; это изобилует дырами в безопасности, если у вас есть какая-либо струнная композиция. Ваш код композиции строк должен быть полностью осведомлен обо всех правилах синтаксического анализа командной строки оболочки и должен избегать всех возможных комбинаций символов, которые могут привести к выполнению произвольной команды.
API system()
C позволяет выполнять произвольные команды, но не имеет механизма для непосредственного захвата вывода. Было бы легко добавить что-то в вашу командную строку, которое изменит вывод во временный файл, который вы позже прочитаете, но при этом просто добавляет больше дыр в безопасности, помимо того, что вся командная строка передается как одна строка.
Подождите ... Похоже, у вас есть простая ошибка:
[task setArguments: [NSArray arrayWithObjects: first_cmd_pt, nil]];
[task setArguments: first_cmd_pt];
Почему вы устанавливаете, а затем заново устанавливаете аргументы задачи?
Учитывая, что ваша функция mount_idisk()
эффективно объединяет отдельные аргументы и объединяет их в одну строку, почему бы вам просто не собрать все аргументы в NSArray
и не изменить doshellscript()
, чтобы получить массив как второй параметр; массив аргументов?
<Ч />
Вы неправильно создаете массив аргументов.
А именно:
NSArray *finished_path = [NSArray arrayWithObjects:@"http://idisk.mac.com/", mac_username, @"/ /Volumes/", mac_username, nil];
Эта строка создает массив, содержащий 4 объекта, которые затем обрабатываются как 4 отдельных аргумента в функции doshellscript()
, а не как два аргумента, которые вам нужны.
Может быть что-то вроде:
NSString *mobileMeUserURL = [@"http://idisk.mac.com/" stringByAppendingString: mac_username];
NSString *localMountPath = [ @"/ /Volumes/" stringByAppendingString: mac_username];
NSArray *arguments = [NSArray arrayWithObjects: mobileMeUserURL, localMountPath, nil];