как написать шаблон pgrep, который (никогда )не соответствует нулевому байту?

Да.

Возможности root были разделены. Теперь у процесса может быть их подмножество (, включая root, у которого их нет ).

Глядя на справочную страницу возможностей , мы можем увидеть, что root может (обычно )делать.

Я включаю сюда несколько :

   CAP_DAC_OVERRIDE
          Bypass file read, write, and execute permission checks.  (DAC
          is an abbreviation of "discretionary access control".)

   CAP_KILL
          Bypass permission checks for sending signals (see kill(2)).
          This includes use of the ioctl(2) KDSIGACCEPT operation.

   CAP_NET_BIND_SERVICE
          Bind a socket to Internet domain privileged ports (port
          numbers less than 1024).

   CAP_SYS_MODULE
          * Load and unload kernel modules (see init_module(2) and
            delete_module(2));
          * in kernels before 2.6.25: drop capabilities from the system-
            wide capability bounding set.

   CAP_SYS_TIME
          Set system clock (settimeofday(2), stime(2), adjtimex(2)); set
          real-time (hardware) clock.

   CAP_SYS_RAWIO
          * Perform I/O port operations (iopl(2) and ioperm(2));
          * access /proc/kcore;
          * employ the FIBMAP ioctl(2) operation;
          * open devices for accessing x86 model-specific registers
            (MSRs, see msr(4));
          * update /proc/sys/vm/mmap_min_addr;
          * create memory mappings at addresses below the value
            specified by /proc/sys/vm/mmap_min_addr;
          * map files in /proc/bus/pci;
          * open /dev/mem and /dev/kmem;
          * perform various SCSI device commands;
          * perform certain operations on hpsa(4) and cciss(4) devices;
          * perform a range of device-specific operations on other
            devices.

Из показанных здесь CAP_SYS_MODULEможно использовать для загрузки модуля ядра, который может это сделать; CAP_SYS_RAWIOможно использовать для открытия /dev/mem; Есть и другие способы с другими возможностями, в том числе ptrace.

1
23.09.2020, 19:36
1 ответ

pgrep -f соответствует конкатенации с символами SPC аргументов, переданных последней команде, выполняемой процессом (, как показано в /proc/pid/cmdlineв Linux ). Это никогда не содержит символов NUL.

Значит, нужно:

pgrep -f '^[^ ]*foo( |$)'

Хотя вы пропустите процессы, которые выполнили какую-либо команду с /path/with space/fooкак argv[0], и он сообщит о процессах, которые выполнили команду с foo barкак argv[0].

В любом случае вы не можете передать NUL в качестве аргумента выполняемой команде, поскольку аргументы команды представляют собой строки с разделителями NUL -.

В zshвы можете передавать NUL встроенным командам и функциям (, поскольку на них не распространяется это ограничение execve(), поскольку они не выполняются). Итак, в Linux вы можете сделать:

print -rC1 /proc/<->(Ne[$'[[ "${$(<$REPLY/cmdline)%%\0*}" = *foo ]]']:t)

, чтобы найти процессы, у которых argv[0]заканчивается на foo.

Или:

print -rC1 /proc/<->/exe(N-.e['[[ $REPLY:A = *foo ]]']:h:t)

Для тех, кто выполняет команду, путь которой заканчивается на foo(, хотя вы можете быть ограничены вашими собственными процессами ).

В Linux имена процессов ограничены 15 байтами и заменяются на первые 15 байтов базового имени первого аргумента каждого вызова, который они делают в execve(), хотя их также можно изменить, записав в /proc/pid/commили с prctl(PR_SET_NAME). Процессы также могут изменять содержимое /proc/pid/cmdline. См., например,:

$ perl -lne 'BEGIN{$0 = "foo bar 90123456789"}; print "$ARGV: $_"' /proc/self/{cmdline,comm}
/proc/self/cmdline: foo bar 90123456789
/proc/self/comm: foo bar 9012345
1
18.03.2021, 23:02

Теги

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