所以我有一个示例应用程序源代码,我试图为自己的目的进行修改
它基本上运行一个shell脚本(下面的测试示例),但是使用了apple的安全框架的privs(请参阅下面的链接获取原始源代码)。
#!/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 };
所以我之前的shell示例会输出如下:
./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代码中的参数,我只需要将它们直接传递给shell脚本(外部命令)。
所以继承我的(希望)简单的问题,如果有人想拿argv []并将它除了参数0(这是./compiled_priv的路径)之外的东西复制到期望char * myArguments var的东西会是什么样子在代码中。我学习了目标C并且从未用C开始,所以这可能是非常基本的,但我尝试过for循环并复制这两个索引,但它不起作用。类似的东西:
char * myArguments [] = argv
是我想要的,但是这不起作用,因为它表示无效的初始化器,即使它确实看起来我们需要在数组的末尾使用NULL,就像NSTask一样。我会包括我的for循环,但它不是首发。
所以我需要从1到数组末尾的argv的内容,并在末尾添加一个NULL,并以与原始示例代码中的char * myArguments []相同的形式将其包装起来。如果我更好地理解c会有所帮助,但同时也有任何想法?
如果有帮助的话,这是我正在玩的源的链接,
答案 0 :(得分:2)
argv
已经采用您需要的格式(NULL
已终止的char *
指针数组),因此您可以这样做:
char **myArguments = &argv[2];
(假设您已经测试argc
至少为2)。