目标:我想在私人 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 文件夹的内容或在其中创建文件。
以下是我尝试过的更改,但没有一个能解决问题:
我已尝试在 bash 脚本中对 ls 和 touch 使用相对路径和绝对路径。
我将“www-data”用户添加到“%sudo”行下的 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
我从 /var/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:
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