我可以从shell和exec()
运行PhantomJS。我正在使用的服务器在~/.fonts/
目录中查找其他字体。当存在这些附加字体时,仅来自shell 我可以使用PhantomJS截取屏幕截图并且预期的字体可以很好地呈现。
> strace ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/bin/phantomjs ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/examples/rasterize.js http://v1.jontangerine.com/silo/typography/web-fonts/ ~/tmp/test.jpg | grep font
打开(" /home/user1/.fonts/TTF/verdana.ttf",O_RDONLY)= 11
打开(" /home/user1/.fonts/TTF/AndaleMo.TTF",O_RDONLY)= 11 打开(" /home/user1/.fonts/TTF/arial.ttf",O_RDONLY)= 11
打开(" /home/user1/.fonts/TTF/cour.ttf",O_RDONLY)= 11
打开(" /home/user1/.fonts/TTF/georgia.ttf",O_RDONLY)= 11
打开(" /home/user1/.fonts/TTF/impact.ttf",O_RDONLY)= 11
...
当我从exec()
尝试相同的命令时,不会搜索用户字体目录。
<?php
exec('strace ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/bin/phantomjs ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/examples/rasterize.js http://v1.jontangerine.com/silo/typography/web-fonts/ ~/tmp/test.jpg | grep font');
不会搜索~/.fonts
目录,但会在没有正确呈现字体的情况下将屏幕截图写入磁盘。
我理解exec()
以Apache用户身份运行,因此不会使用用户字体。但是,
> whoami
用户1
和
<?php
echo exec('whoami');
用户1
两者都显示为同一个用户,因此我怀疑这是误导性的,因为它在shell中完美运行(字体和全部):
php -r "exec('~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/bin/phantomjs ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/examples/rasterize.js http://v1.jontangerine.com/silo/typography/web-fonts/ ~/tmp/test.jpg');"
我理解setuid
可以允许用户使用其所有者(user1)的权限执行程序,但这并没有帮助。此特定服务器是共享服务器,su
和sudo
已禁用,因此不允许以其他用户身份运行。
Linux用户配置不是我的专业领域,但是使用exec()
如何运行PhantomJS命令以便包含用户字体?
研究:
/etc/sudoers
。