версия: 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
Почему? Как я могу получить ожидаемый результат?