/bin/sh: 0: Не могу открыть sh

Parece que lo es:

oom_score = badness * 1000 / totalpages

basado en el código del núcleohttps://github.com/torvalds/linux/blob/master/fs/proc/base.c#L549.

static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns,
              struct pid *pid, struct task_struct *task)
{
    unsigned long totalpages = totalram_pages + total_swap_pages;
    unsigned long points = 0;

    points = oom_badness(task, NULL, NULL, totalpages) *
                    1000 / totalpages;
    seq_printf(m, "%lu\n", points);

    return 0;
}

3
19.07.2019, 21:15
1 ответ
char* argv[] = {"/bin/sh","sh","-c","/bin/ls", (char*) NULL};
execve(argv[0], argv, environ);

Обратите внимание, что вы используетеargv[0](/bin/sh)дважды, один раз в качестве первого аргумента для execve(), а другой раз как часть массива, переданного в качестве второго аргумента. Это не то, что происходит в вашем execl()вызове, там у вас есть только /bin/shв качестве первого аргумента (файл программы ).

Итак, ваш execve()выполняет файл /bin/sh, присваивая ему имя программы (нулевой аргумент )из /bin/shи обычные аргументы sh, -c, /bin/ls. Это почти то же самое, что и вызов execl("/bin/sh", "/bin/sh", "sh", "-c", "/bin/ls", (char*) NULL). Или в командной строке оболочки:

$ /bin/sh sh -c /bin/ls
/bin/sh: 0: Can't open sh

Это говорит оболочке попытаться запустить скрипт с именем shв текущем каталоге, и Dash выдает сообщение об ошибке, если скрипт не существует.Ноль, вероятно, является номером строки для аргумента командной строки. (Bash выдает похожее, но другое сообщение об ошибке и, кажется, тоже ищет сценарий из PATH. Я не уверен, что стандарт говорит что-либо об использовании здесь PATH.)

Вместо этого вы могли бы сделать

char *program = "/bin/sh";
char *argv[] = {"sh", "-c", "/bin/ls", NULL};
execve(program, argv, environ);

или, может быть,

char *argv[] = {"/bin/sh", "sh", "-c", "/bin/ls", NULL};
execve(argv[0], argv + 1, environ);
12
27.01.2020, 21:09

Теги

Похожие вопросы