Итак, у меня есть пример исходного кода приложения, который я пытаюсь изменить для своих собственных целей
это в основном выполняется сценарий оболочки (тестовый пример ниже), но с привилегированным использованием инфраструктуры безопасности apple (см. Ссылку ниже для оригинального источника).
#!/bin/bash
echo $@
whoami
В этом примере кода мы передаем следующее:
myFlags = kAuthorizationFlagDefaults; // 8
myStatus = AuthorizationExecuteWithPrivileges // 9
(myAuthorizationRef, myToolPath, myFlags, myArguments,
&myCommunicationsPipe);
Я изменил команду, добавив myToolPath в качестве первого аргумента следующим образом:
// Grab the arguent length
int size = strlen(argv[1]);
// Grab the first argument
char myToolPath[size];
strcpy(myToolPath,argv[1]);
, который работает, это значит, когда я запускаю
./compiled_priv_tool /tmp/example.sh
Возвращает «root», а не пользователя, которого я использую.
Но теперь я хочу иметь возможность передавать аргументы этому помощнику и добавлять их в этот массив
Это то, что делает пример в примере кода
char *myArguments[] = { "-u", NULL };
Таким образом, мой предыдущий пример оболочки будет иметь следующий вид:
./compiled_priv_tool /tmp/example.sh
-u
root
но я бы хотел иметь возможность динамически передавать столько аргументов, сколько argv может содержать в этот скрипт, чтобы вывод выглядел следующим образом
./compiled_priv_tool /tmp/example.sh -u user -f file path -b lah
-u user -f file path -b lah
root
Мне не нужно обрабатывать аргументы в коде C, мне просто нужно, чтобы они были переданы непосредственно в скрипт оболочки (внешняя команда).
Итак, вот мой (надеюсь) простой вопрос, если бы кто-то хотел взять argv [] и скопировать его, за исключением аргумента 0 (который является путем к ./compiled_priv), к чему-то ожидающему char * myArguments var, как бы это выглядело в коде. Я изучил цель C и никогда не начинал с C, так что это, вероятно, довольно просто, но я пробовал цикл for и копировал два индекса, но он не работает. что-то вроде:
char * myArguments [] = argv
- это то, что я хочу, но это не работает, так как в нем указано неверный инициализатор, и даже если это так, похоже, нам нужен NULL в конце массива, очень похожий на NSTask. Я бы включил цикл for, но это не стартер.
Так что мне нужно содержимое argv от 1 до конца массива и добавить NULL в конец и обернуть его в ту же форму, что и char * myArguments [] в исходном примере кода. Если бы я понял лучше, это помогло бы, но в то же время есть мысли?
Вот ссылка на источник, с которым я играю, если это поможет,
http://developer.apple.com/library/mac/documentation/security/conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/TP30000995-CH206-TPXREF33