首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过C setuid包装器将命令行参数传递给另一个脚本

通过C setuid包装器将命令行参数传递给另一个脚本
EN

Stack Overflow用户
提问于 2012-08-18 16:35:05
回答 4查看 1.4K关注 0票数 1

我有以下c setuid包装器:

代码语言:javascript
复制
#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脚本中的所有参数。我应该如何更换我的包装器?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-18 17:43:46

这是一个处理可变数量参数的版本。请注意,您的syscall应该进行测试,以确保一切正常。

代码语言:javascript
复制
#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;
}
票数 2
EN

Stack Overflow用户

发布于 2012-08-18 19:36:44

还有一个很好的解决方案,它不需要任何分配,能够处理任意的长命令,并且不意味着运行无用的进程,因为它不使用system。此外,使用以下解决方案,您可以免费获得衍生进程的退出代码。

代码语言:javascript
复制
#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;
}
票数 3
EN

Stack Overflow用户

发布于 2012-08-18 16:42:02

您应该使用sprintf构建一个带有您的选项的字符串,然后将此字符串传递给system:

代码语言:javascript
复制
 char command [100];
 sprintf (command, "./cwrapper %s --%s --%s --%s", program_name,option1,option2,
     option3);
 system(command);

更新:这种方法假设参数的数量是固定的,回头看看你的问题,我发现情况可能并非如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12017168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档