pcntl_exe c () не заменяет текущий процесс новой программой - PullRequest
0 голосов
/ 04 мая 2020

версия: php7 .4-cli

говорит , что pcntl_exec является действительным человеком, выполняющим действия системы (2). Что я увидел в описании execve:

execve() выполняет программу, указанную pathname. Это приводит к тому, что программа, которая в данный момент выполняется вызывающим процессом, заменяется новой программой с вновь инициализированными сегментами стека, кучи и (инициализированными и неинициализированными) данных.

Поэтому я предполагаю, что pcntl_exe c сделает то же самое при замене, когда я наберу код ниже:

#!/usr/bin/php
<?php
$command = "/bin/bash";

if ($argv[0] == __FILE__) {
    system("mount --make-rprivate /");

    system("mount -t proc proc /proc -o noexec,nosuid,nodev");

    pcntl_exec($command, [], getenv());
} else {
    pcntl_unshare(CLONE_NEWPID | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWNET);

    $process = proc_open(__FILE__, [
        STDIN,
        STDOUT,
        STDERR,
    ], $pipe);

    if (!is_resource($process)) exit(-1);

    pcntl_wait($status);
}

Этот сценарий должен создать процесс изоляции пространства имен с процессом init (что означает, что pid равен 1) /bin/bash.

Хотя на самом деле это процесс pid 2 в соответствии с ps -ef:

\# ps -ef

UID          PID    PPID  C STIME TTY      TIME     CMD
root           1       0  0 15:53 pts/0    00:00:00 sh -c lxc.php
root           2       1  0 15:53 pts/0    00:00:00 /bin/bash
root          16       2  0 15:54 pts/0    00:00:00 ps -ef

Почему? Как я могу получить ожидаемый результат?

...