我正在尝试调试一个大约一周前运行良好的进程。我有一个可供我的网络服务器访问的脚本,它除了将值写入现有的命名管道外什么也不做:
#!/bin/bash
pipe=/tmp/al_webui
echo 5 > $pipe
该脚本使用 sudo 调用,并且 Web 服务器可以通过允许它来执行它visudo
。
以前这种方法有效,但现在命名管道中什么都没有出现。如果我手动执行脚本,写入就会成功,如果 Web 服务器调用它,则什么也不会发生。我没有收到任何错误消息。我可以看到脚本在我的 中被正确调用/var/log/auth.log
:
Sep 4 12:22:30 luc sudo: www-data : TTY=unknown ; PWD=/srv/www/htdocs/al ; USER=root ; COMMAND=./al_webui_trigger.sh
Sep 4 12:22:30 luc sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Sep 4 12:22:30 luc sudo: pam_unix(sudo:session): session closed for user root
日志列出了所有成功的其他脚本调用(尽管它们没有尝试写入命名管道)。
我已经不知道该去哪里查找了,因为我没有收到任何错误的文件路径或权限错误(故意在路径中引入错误会立即显示出来,auth.log
但chmod 777
不会改变任何内容)。有人知道此时该怎么做吗?
我在 Debian Stretch 上运行它,自从我从 Jessie 升级以来,错误可能已经开始出现,但我不确定这是否有关联。
答案1
原来 PrivateTmp 设置是罪魁祸首,我猜想这种行为在升级过程中发生了变化。这意味着 Web 服务器服务自动与其私有临时目录相关联,因此写入了与我读取的管道不同的管道。解决方案来自这里:
mkdir /etc/systemd/system/apache2.service.d
echo -e "[Service]\nPrivateTmp=no" > /etc/systemd/system/apache2.service.d/privatetmp.conf
systemctl daemon-reload
systemctl restart apache2
systemctl show apache | grep PrivateTmp
这将为 apache 进程使用的专用配置创建一个目录。配置文件中只列出了一个条目,它将覆盖我们要更改的值PrivateTmp
并将其设置为false
。其余部分将重新加载 systemctl 守护程序,重新启动 Web 服务器并检查更改是否成功。
在决定这是否是适合您的解决方案之前,请注意共享 tmp 目录对安全的影响。