-1

setuid/setgid ビットによって与えられる権限で実行したい次の Python スクリプトがあります。

#!/usr/bin/env python3
from mypackage.cli import main as cli_main
cli_main()

ただし、中間の Python スクリプト ファイルを使用せずに、C ラッパーからコマンドを直接実行したいと考えています。

次のように使用してこれを試しましたexecve

#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char *ENV = "/usr/bin/env";
const char *ENV_ARGS[] = { "python3", "-c", "from mypackage.cli import main as cli_main; cli_main()" };
const int NUM_ENV_ARGS = 3;

int main(int argc, char *argv[], char *envp[]) {
    int total_num_args = (argc - 1) + NUM_ENV_ARGS + 1;

    // Create an array of strings to hold the final arg list.
    // No need to free the malloc'ed memory as it will be freed if execve succeeds,
    // or when the program exits if execve fails.
    char **final_args = (char **)malloc(total_num_args * sizeof(char *));
    if (final_args == NULL) {
        return 1;
    }

    // Copy the invocation and the arguments to this program into the final arg list.
    memcpy(final_args, ENV_ARGS, NUM_ENV_ARGS * sizeof(char *));
    memcpy(final_args + NUM_ENV_ARGS, argv + 1, (argc - 1) * sizeof(char *));
    final_args[total_num_args - 1] = NULL;

    return execve(ENV, final_args, envp);
}

しかし、コンパイルされたプログラムを次のように実行すると、次のエラーが発生します./mycli foo bar

python3: illegal option -- c
usage: env [-iv] [-P utilpath] [-S string] [-u name]
           [name=value ...] [utility [argument ...]]

どうすればこれを達成できますか?

4

2 に答える 2

1

python3コマンドを実行していません。コマンドを実行していますenvENV変数には/usr/bin/python3、またはパス先のものが含まれている必要がpython3あります。

于 2016-12-05T20:29:56.920 に答える
1

引数配列を正しく構成していません。argvこれは、0番目の要素がプログラムの名前を指定することを含め、実行されたプログラムの配列に正確に対応する必要があります。この場合、慣習的に "env" または "/usr/bin/env" になります。「env」をスキップしたため、エラー メッセージで示されているように、env「python3」を独自の名前として解釈しています。そのメッセージはenv、Python からではなく、から来ています。

于 2016-12-05T20:37:44.823 に答える