псевдонимы не могут иметь аргументов, используйте функцию:
function SU { sudo $*; }
Одним из способов может быть 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);
}
Во-первых, вы можете упростить свою задачу, вырезав один из промежуточных процессов. :Здесь нет причин использовать 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
, целью которого является повышение его привилегий, у вас, вероятно, нет разрешения на отправку его или его дочерних сигналов.