1

次の 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]);
}

で perl スクリプトを呼び出すことができます./cwrapper perlscript.pl

./cwrapper perlscript.pl --option1 --option2 --option3GetOptions を使用して、perl スクリプト内のすべての引数を実行し、詳しく説明したいと思います。ラッパーを変更するにはどうすればよいですか?

4

4 に答える 4

3

割り当てを必要とせず、任意の長いコマンドを処理でき、使用しないため無駄なプロセスを実行することを意味しない、優れたソリューションもあります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-18T11:36:43.840 に答える
2

これは、可変数の引数を扱うバージョンです。システムコールをテストして、すべてが正常であることを確認する必要があることに注意してください。

#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-18T09:43:45.973 に答える
0

argv[0] は c プログラムの名前であるため無視し、他のすべてを使用します。strlen( ) 新しい文字列を組み立てるために必要なメモリ、新しい文字列のメモリを計算し、すべての( )malloc()を連結して新しい文字列を構築できます。または、固定長のアプローチについては、@ dan1111 の回答に従ってください。argvstrcat

于 2012-08-18T09:07:28.260 に答える
0

オプションを使用sprintfして文字列を作成し、この文字列をシステムに渡す必要があります。

 char command [100];
 sprintf (command, "./cwrapper %s --%s --%s --%s", program_name,option1,option2,
     option3);
 system(command);

更新: このアプローチは固定数の引数を想定しており、質問を振り返ってみると、そうではない可能性があります。

于 2012-08-18T08:42:02.467 に答える