【问题标题】:Different answer from same script depending on caller (php exec() vs. console)来自同一脚本的不同答案取决于调用者(php exec()与控制台)
【发布时间】:2015-11-12 03:32:05
【问题描述】:

我通过二进制包装器(参见 [Execute root commands via PHP)以 root 权限从 PHP(5.4)运行 Bash-Scripts,除了以下示例外,它工作得非常好。另外,我在 CentOS7 上使用 zfs-on-linux。

我准备了 2 个简单的示例 Bash-Scripts:

test_zfsadd:

#!/bin/bash

#ARGS=1

err="$(zfs create $1 2>&1 > /dev/null)"

if [ $? -ne 0 ]
then
        echo $err
        exit 1
fi

echo "OK"
exit 0

test_zfspart:

#!/bin/bash

#ARGS=1

msg="$(zfs get mounted $1 -H | awk '{print $3}')"

echo $msg
exit 0

当我用 e 从 PHP 调用相应的二进制文件时。 g.

<?php

$partition = 'raid1/testpart';

$ret = shell_exec("/path/test_zfsadd_bin $partition");
echo "<p>Return value: $ret</p>\n";

$ret = shell_exec("/path/test_zfspart_bin $partition");
echo "<p>Is mounted: $ret</p>\n";

输出是:

Return value: OK
Is mounted: yes 

这看起来不错,但是当我直接从控制台调用“test_zfspart_bin raid1/testpart”时,我得到了正确的结果

no

(表示分区未挂载,在 /proc/mounts 中检查)。所以我从同一个脚本中得到了 2 个不同的答案,这取决于上下文。我首先认为它与 SUID-Bit 有关,但在控制台中使用非特权用户调用脚本可以正常工作。如果我尝试(以 root 身份)

zfs mount raid1/testpart

在控制台中我得到

filesystem 'raid1/testpart' is already mounted
cannot mount 'raid1/testpart': mountpoint or dataset is busy

这很奇怪。我也无法从控制台销毁“分区”,这仅适用于 PHP。另一方面,如果我直接从 bash 以 root 身份创建一个分区并尝试通过 PHP 删除它,它也不起作用。看起来分区以某种方式通过上下文彼此分离。如果我这样做,一切都会再次同步

systemctl restart httpd

我认为 apache 或 PHP 使 zfs 系统在某种程度上保持忙碌,但我完全不知道为什么以及如何。非常感谢任何解释或一些解决方法。

【问题讨论】:

    标签: php linux bash zfs


    【解决方案1】:

    与此同时,我自己也想通了。问题不在于 apache 进程本身,而在于 systemd 是如何启动它的。有一个选项叫做'PrivateTmp',默认情况下在httpd服务文件中设置为'true'(至少在CentOS7中)。手册页说

    PrivateTmp= 接受一个布尔参数。如果 true 设置一个新的文件系统 已执行进程的命名空间并挂载私有 /tmp 里面的目录,不被外部的进程共享 命名空间。这对于保护对临时文件的访问很有用 进程,但通过 /tmp 在进程之间进行共享 不可能的。默认为 false。

    这解释了我所想的一切。新创建的 zfs 分区安装在这个“虚拟”文件系统中,因此对系统的其余部分不可见,这在这种情况下是不希望的。 apache 进程无法在其命名空间之外挂载或卸载文件系统。禁用该选项后,一切都按预期工作。

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2021-03-07
      相关资源
      最近更新 更多