gpt4 book ai didi

PHP proc_open bash 与破折号

转载 作者:IT王子 更新时间:2023-10-29 01:26:51 27 4
gpt4 key购买 nike

考虑这个示例脚本:

<?php

$pipes = array();
$p = proc_open('cat', array(0 => STDIN, 1 => STDOUT, 2 => STDERR), $pipes);
fgetc(STDIN);

/bin/sh 符号链接(symbolic link)到 /bin/dash(Debian 默认设置)时,cat 在 shell 中执行:

30760 pts/0    S+     0:00  |           \_ php f.php
30761 pts/0 S+ 0:00 | \_ sh -c cat
30762 pts/0 S+ 0:00 | \_ cat

然而,当 /bin/sh 链接到 /bin/bash 时,catphp :

30786 pts/0    S+     0:00  |           \_ php f.php
30787 pts/0 S+ 0:00 | \_ cat

这是非常烦人的不一致,它使得无法可靠地向生成的进程发送信号(因为信号有时会被 shell 接收)。

为什么是proc_open根据 /bin/sh 指向的位置表现不同?有没有办法不运行 shell,即使 /bin/sh 不是 bash

最佳答案

PHP 在这两种情况下都通过/bin/sh 运行命令,区别在于 shell,而不是 PHP。 dash fork 进程以运行命令(在本例中为 cat)并等待它完成。 bash 执行一个 execve(),因此它将自己的进程替换为 cat。

虽然他们似乎已经在以后的版本中修复了它:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=436466

使用 bash 或最新版本的 dash 应该可以解决您的问题,因为执行的命令会获取生成的 shell 的 PID,从而接收信号。

关于PHP proc_open bash 与破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22644310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com