我正在尝试在无头服务器上执行 firefox 以获取网站的屏幕截图。我可以在终端使用
做到这一点“DISPLAY=:12 firefox -saveimage http://www.google.com/”。
问题是当我尝试做 system("DISPLAY=:12 firefox -saveimage http://www.google.com");不起作用。我有一种感觉,它不是在正常的 shell 环境中执行的。我违背了我更好的判断,给了 apache 用户一个实际的 shell。如果我 su 到 apache 并执行命令,一切都很好并且按预期工作,但它再次无法通过系统调用工作。任何见解都非常受欢迎。
我找到了解决方案。
我只需要创建一个 shell 脚本来为我调用它。玩了一会儿后,我在脚本顶部添加了
export HOME="/var/www/"
后就开始工作了。
我希望这对其他人有帮助。
很可能对您设置为 shell 用户的环境变量有一些依赖性,而 httpd 的环境无法实现。不过,在对环境进行任何英雄行为之前,我建议从您的工作中捕获 stderr(例如,通过在其末尾添加
2>/tmp/imgcaperrlog
)并查看它是否提出任何投诉。
经过几个小时的研究,我开始工作了,我在 Xvfb 和 xfreerdp 上遇到了同样的问题。 似乎 apache2 mod_php 没有为用户 www-data 设置一个家,所以从 URL 调用 php 脚本,使 xfreerdp 崩溃,因为它需要写入 ~/.config/freerdp 目录。另一方面,从 php CLI 调用它是可行的,因为 shell 已经在环境中设置了一个 home。
在不使用外部 shell 脚本的情况下,我可以使用它:
<?php
exec("nohup Xvfb :12 -screen 0 1280x1024x24 -nolisten unix &");
exec("DISPLAY=:12.0 HOME=/home/www-data/ nohup xfreerdp /bpp:24 /size:1280x1024 /u:admin /p:\"XXXXXX\" /v:10.0.0.10 /cert-ignore &");
我添加
-nolisten unix
以避免用户www-data创建/tmp/.X11-unix/
文件夹。该目录应归 root 所有。 (在我的情况下,我不需要 Xvfb 监听套接字)
@William 非常感谢您的投入,你和我一样。