Завершить процесс, запущенный execl

псевдонимы не могут иметь аргументов, используйте функцию:

function SU { sudo $*; }
1
06.06.2017, 00:08
2 ответа

Одним из способов может быть sudo kill дочерний pid из родительского процесса, при условии, что sudoers предоставляет это.

#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void sudokill(pid_t tokill);

int main(void)
{
    pid_t pid;

    pid = fork();
    switch (pid) {
    case -1:
        err(1, "fork() failed");
    case 0:
        execlp("sudo", "sudo", "sleep", "999", (char *) NULL);
        err(1, "execlp() failed");
    default:
        sleep(7);
        sudokill(pid);
    }
    exit(EXIT_SUCCESS);
}

void sudokill(pid_t tokill)
{
    char *killstr;
    int status;
    pid_t pid;

    if (asprintf(&killstr, "%d", tokill) < 0)
        err(1, "asprintf() failed");

    pid = fork();
    switch (pid) {
    case -1:
        err(1, "fork() failed");
    case 0:
        execlp("sudo", "sudo", "kill", killstr, (char *) NULL);
        err(1, "execlp() failed");
    default:
        wait(&status);
    }

    free(killstr);
}
1
27.01.2020, 23:19

Во-первых, вы можете упростить свою задачу, вырезав один из промежуточных процессов. :Здесь нет причин использовать sh -cдля запуска вашего процесса. Фактически, это потенциально менее безопасно, если ваша фактическая командная строка построена динамически. Вместо:

execl("/bin/sh","sh","-c","sudo nmap -sS -A 192.168.0.1/24",NULL);

Вы должны просто сделать:

execlp("sudo", "sudo", "nmap", "-sS", "-A", "192.168.0.1/24", NULL);

Теперь у вас есть только два процесса :sudoи сам nmap. Вы знаете идентификатор родительского процесса (sudo), но не знаете идентификатор дочернего процесса (nmap). Но это не имеет значения, потому что вы можете использовать функциюsudo:убить родителя (с помощью SIGTERM), и он перешлет сигнал потомку для вас.

Ваша последняя оставшаяся проблема не связана напрямую с вопросом, который вы задаете, но в любом случае у вас, вероятно, нет разрешения на завершение любого из этих процессов! Поскольку задействован sudo, целью которого является повышение его привилегий, у вас, вероятно, нет разрешения на отправку его или его дочерних сигналов.

3
27.01.2020, 23:19

Теги

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