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
相关产品推荐
相关产品推荐

