运行 PhantomJS 通过 exec() - 包含 ~/.fonts 的问题
Running PhantomJS through exec() - issue with including ~/.fonts
我可以从 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
open("/home/user1/.fonts/TTF/verdana.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/AndaleMo.TTF", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/arial.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/cour.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/georgia.ttf", O_RDONLY) = 11
open("/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
user1
和
<?php
echo exec('whoami');
user1
两者都显示为同一用户,所以我怀疑这是一种误导,因为这在 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 命令包含用户字体?
研究:
- Running PhantomJS from PHP with exec() - 问题出在 $PATH
- PHP + PhantomJS Rasterize - 这是 HostGator
的问题
- exec() and phantomjs issue with absolute paths - 一个答案建议 运行将命令设置为 cron,这是行不通的。也无法修改
/etc/sudoers
。
当 printenv
和 exec('printenv')
分别为 运行 时,问题就暴露出来了
HOME=/home/user1
和
HOME=/home/user1/tmp
这意味着即使 whoami
和 exec('whoami')
都是 return user1
,但共享主机配置中的某些内容将主目录设置为 /tmp
,将脚本沙盒化是明智的。
解决方案是在 exec 命令前添加 export HOME=~;
(not HOME=~;
)。即
exec('export HOME=~; 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
目录,现在可以搜索用户字体。
我可以从 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
open("/home/user1/.fonts/TTF/verdana.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/AndaleMo.TTF", O_RDONLY) = 11 open("/home/user1/.fonts/TTF/arial.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/cour.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/georgia.ttf", O_RDONLY) = 11
open("/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
user1
和
<?php
echo exec('whoami');
user1
两者都显示为同一用户,所以我怀疑这是一种误导,因为这在 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 命令包含用户字体?
研究:
- Running PhantomJS from PHP with exec() - 问题出在 $PATH
- PHP + PhantomJS Rasterize - 这是 HostGator 的问题
- exec() and phantomjs issue with absolute paths - 一个答案建议 运行将命令设置为 cron,这是行不通的。也无法修改
/etc/sudoers
。
当 printenv
和 exec('printenv')
分别为 运行 时,问题就暴露出来了
HOME=/home/user1
和
HOME=/home/user1/tmp
这意味着即使 whoami
和 exec('whoami')
都是 return user1
,但共享主机配置中的某些内容将主目录设置为 /tmp
,将脚本沙盒化是明智的。
解决方案是在 exec 命令前添加 export HOME=~;
(not HOME=~;
)。即
exec('export HOME=~; 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
目录,现在可以搜索用户字体。