2016-12-05 4 views
-1

У меня есть следующий Python скрипт, который я хотел бы выполнить с правами доступа, обеспечиваемой Setuid/setgid бит:Выполнение команды Python с УИП/setgid обертке

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

Однако: я бы например, выполнить команду непосредственно из C-оболочки без промежуточного файла сценария Python.

Я пытался сделать это с помощью 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 ...]] 

Как я могу это сделать?

+0

'./mycli foo bar'. Такая же ошибка возникает без каких-либо аргументов. – DanielGibbs

ответ

1

Неправильно создается массив аргументов. Он должен точно соответствовать массиву argv программы exec'ed, в том числе, что элемент 0 th обозначает имя программы, которое в этом случае обычно будет «env» или «/ usr/bin/env». Поскольку вы пропускаете «env», env интерпретирует «python3» как свое собственное имя, о чем свидетельствует сообщение об ошибке. Это сообщение происходит от env, а не от Python.

+0

А я вижу. Задача решена; Благодарю. – DanielGibbs

1

Вы не управляете командой python3. Вы используете команду env. Переменная ENV должна содержать /usr/bin/python3 или что бы вы ни отправили в python3.

+0

Переменные окружения передаются от вызывающего к вызову 'execve', поэтому' env' получает те же переменные, которые он имел бы, если бы я вызывал его непосредственно из командной строки. – DanielGibbs

+0

@ DanielGibbs Нет, эти переменные окружения находятся в 'indvp'. Нет необходимости называть 'env'. – dbush

+0

Итак, что бы я изменил, чтобы заставить его работать? Я хотел бы использовать 'env', поскольку я не могу гарантировать, где находится исполняемый файл' python3'. – DanielGibbs