无法通过 PHP 执行的 Bash 脚本列出 /var/tmp 文件夹中的内容或创建文件

无法通过 PHP 执行的 Bash 脚本列出 /var/tmp 文件夹中的内容或创建文件

目标:我想在私人 Linux 机器(未连接到互联网的本地系统)上触发一个 webhook,它可以删除 /var/tmp 文件夹中由 CUPS 服务器生成的假脱机数据。

为了达成这个

方法1 我首先检查了默认的 CUPS 配置文件并编辑了其中的文件。/etc/cups/cupsd.conf 中的行

PreserveJobFiles No

以及 /etc/cups/cups-files.conf

RequestRoot /var/tmp

我认为将 PreserveJob 更改为 no 将在打印完成后自动删除 cups 假脱机文件。

好吧,方法 1 没有奏效,所以我尝试了方法 2

方法2: 我有一台安装了 Apache 和 PHP 的 Ubuntu 22.04 机器。我设置了一个新的虚拟主机“example.io”,并将 DocumentRoot 设置为 /var/www/example.io/

在这个目录中,我有一个 index.php 文件,可以成功地向 Web 浏览器提供内容。

从这个 index.php 文件中,我调用位于我的主目录中的 bash 脚本。该 bash 脚本包含以下命令:

#!/bin/bash

echo "Hello, I am above the ls command"
ls /var/tmp/

echo "Hello, I am below the ls command"
touch example.txt

rm -rf /var/tmp/cn*

echo "I am below the touch command"

bash 脚本正在执行,我可以在 Web 浏览器中看到 echo 语句的输出。但是,我无法列出 /var/tmp 文件夹的内容或在其中创建文件。

以下是我尝试过的更改,但没有一个能解决问题:

  1. 我已尝试在 bash 脚本中对 ls 和 touch 使用相对路径和绝对路径。

  2. 我将“www-data”用户添加到“%sudo”行下的 sudoers 文件中。

    www-data ALL=(ALL) NOPASSWD: /home/example/script.sh                                                        
    www-data ALL=(ALL) NOPASSWD: /var/tmp
    
  3. 我将 bash 脚本的权限更改为“www-data”用户拥有。

    drwxrwxrwx  5 www-data www-data    6 Jun  6 08:39 script.sh
    
  4. 我将 /var/tmp 文件夹的权限更改为“www-data”用户可以访问。

    drwxrwxrwt  5 www-data www-data    6 Jun  6 08:39 tmp
    
  5. 我从 /var/tmp 文件夹中删除了粘滞位并将其权限设置为 777。

    drwxrwxrwx  5 www-data www-data    6 Jun  6 08:39 tmp
    
  6. 我授予了 bash 脚本及其父目录完全权限。

当我从命令行检查时,我能够使用 www-data 用户在 /var/tmp 中列出并创建文件,例如

root@cups-lxc-at-ct:~/instantpost# sudo -u www-data touch /var/tmp/cnijb
root@cups-lxc-at-ct:~/instantpost# sudo -u www-data ls /var/tmp
cnijb
systemd-private-329d46999f134f4a9470ce054ae837e9-apache2.service-iHoe2E
systemd-private-329d46999f134f4a9470ce054ae837e9-systemd-logind.service-lGcUhs
systemd-private-329d46999f134f4a9470ce054ae837e9-systemd-resolved.service-Rqvc7r

/var/tmp 上的 ACL 是

root@cups-lxc-at-ct:~/instantpost# getfacl /var/tmp
getfacl: Removing leading '/' from absolute path names
# file: var/tmp
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
other::rwx

我检查了AppArmor:

sudo apparmor_status

我得到了这个输出

root@cups-machine:~# sudo apparmor_status                       
apparmor module is loaded.
11 profiles are loaded.
11 profiles are in enforce mode.
   /usr/bin/man
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/NetworkManager/nm-dhcp-helper
   /usr/lib/connman/scripts/dhclient-script
   /{,usr/}sbin/dhclient
   lsb_release
   man_filter
   man_groff
   nvidia_modprobe
   nvidia_modprobe//kmod
   tcpdump
0 profiles are in complain mode.
0 profiles are in kill mode.
0 profiles are in unconfined mode.
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
0 processes are in mixed mode.
0 processes are in kill mode.

=> 有趣的是,我已经用不同的文件夹测试了相同的方法,例如:/usr、/usr/example、/tmp/example、/home/example 等,并且它成功运行。

我很难理解为什么我会遇到这个问题,特别是在默认的 /var/tmp 文件夹中。任何见解或建议都将不胜感激。

答案1

将一切恢复原状。最好的情况是,您已经严重损害了主机的安全性。您可能已经破坏了功能。

仅有的通过 web-hook 安全地删除文件的方法是通过 sudo:

www-data host=(root) NOPASSWD: /home/example/script.sh 

不要将其添加到您的 sudoers 文件中,在 /etc/sudoers.d/ 中创建一个新文件,并确保权限为 0600,所有者为 root:root。使用以下命令检查其是否正常工作:sudo -l -U www-data

相关内容