我有以下c setuid包装器:
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
main( int argc, char ** argv ) {
struct passwd *pwd;
char user[] = "cvmfs-test";
pwd = getpwnam(user);
setuid(pwd->pw_uid);
system(argv[1]);
}我可以用./cwrapper perlscript.pl调用我的perl脚本。
我想使用GetOptions来实现./cwrapper perlscript.pl --option1 --option2 --option3,并详细说明perl脚本中的所有参数。我应该如何更换我的包装器?
发布于 2012-08-18 17:43:46
这是一个处理可变数量参数的版本。请注意,您的syscall应该进行测试,以确保一切正常。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <pwd.h>
#define CMDMAXLGTH 4096
#define SETUIDUSER "testuser"
int main( int argc, char ** argv ) {
struct passwd *pwd;
char user[] = SETUIDUSER;
char buf[CMDMAXLGTH];
char *p = buf;
int i = 1;
pwd = getpwnam(user);
// success test needed here
setuid(pwd->pw_uid);
// success test needed here
memset (buf, 0, sizeof(buf));
while (argv[i]) {
p += sprintf(p, " %s", argv[i++]);
}
system(buf);
return 0;
}发布于 2012-08-18 19:36:44
还有一个很好的解决方案,它不需要任何分配,能够处理任意的长命令,并且不意味着运行无用的进程,因为它不使用system。此外,使用以下解决方案,您可以免费获得衍生进程的退出代码。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <pwd.h>
#define SETUIDUSER "foobar"
int main(int argc, char **argv) {
struct passwd *pwd;
char user[] = SETUIDUSER;
pwd = getpwnam(user);
// success test needed here
setuid(pwd->pw_uid);
// success test needed here
if (argc < 2)
return 1;
execvp(argv[1], &argv[1]);
return 42;
}发布于 2012-08-18 16:42:02
您应该使用sprintf构建一个带有您的选项的字符串,然后将此字符串传递给system:
char command [100];
sprintf (command, "./cwrapper %s --%s --%s --%s", program_name,option1,option2,
option3);
system(command);更新:这种方法假设参数的数量是固定的,回头看看你的问题,我发现情况可能并非如此。
https://stackoverflow.com/questions/12017168
复制相似问题