You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用的Bash脚本无法列出/var/tmp目录内容或创建文件的问题排查求助

PHP调用的Bash脚本无法列出/var/tmp目录内容或创建文件的问题排查求助

大家好,我现在遇到一个棘手的问题,想请各位帮忙排查一下:

我的目标是在一台不联网的本地Linux机器上触发一个webhook,用来删除CUPS服务器在*/var/tmp*目录下生成的打印缓存数据。

尝试过的方法

方法1:修改CUPS配置

我先检查并修改了CUPS的默认配置文件:

  • 在/etc/cups/cupsd.conf里设置了PreserveJobFiles No
  • 在/etc/cups/cups-files.conf里设置了RequestRoot /var/tmp

原本以为把PreserveJobFiles设为No后,打印完成后CUPS会自动删除缓存文件,但这个方法没生效。

方法2:通过Apache+PHP调用Bash脚本

我在Ubuntu 22.04机器上装了Apache和PHP,搭建了名为example.io的虚拟主机,DocumentRoot设为/var/www/example.io/,其中的index.php能正常向浏览器返回内容。

现在我在index.php里调用一个位于家目录的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"

脚本确实在执行,浏览器能看到所有echo语句的输出,但无法列出*/var/tmp*目录的内容,也不能在该目录下创建文件。

我试过的所有排查/修改操作(均未解决问题)

  • 在Bash脚本里同时试过相对路径和绝对路径执行ls、touch命令
  • 将www-data用户添加到sudoers文件中,添加了以下两行:
    www-data ALL=(ALL) NOPASSWD: /home/example/script.sh
    www-data ALL=(ALL) NOPASSWD: /var/tmp
    
  • 修改Bash脚本的所有者为www-data,权限设置为drwxrwxrwx 5 www-data www-data 6 Jun 6 08:39 script.sh
  • 修改*/var/tmp*目录的所有者为www-data,先是保留粘滞位的权限drwxrwxrwt 5 www-data www-data 6 Jun 6 08:39 tmp,后来去掉粘滞位改成777权限:drwxrwxrwx 5 www-data www-data 6 Jun 6 08:39 tmp
  • 给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状态,输出显示没有相关的限制:

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*目录不行。

我实在搞不懂问题出在哪,希望各位能给我一些排查思路或者解决建议,非常感谢!

备注:内容来源于stack exchange,提问作者Sheikh Muhammed Tadeeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:13:04