2016-08-13 3 views
0

Я могу запустить PhantomJS как из оболочки, так и из exec() в порядке. Используемый мной сервер ищет дополнительные шрифты в каталоге ~/.fonts/. Когда эти дополнительные шрифты присутствуют, только из оболочки Я могу сделать скриншот с PhantomJS, и ожидаемые шрифты выглядят хорошо.Запуск PhantomJS через exec() - проблема с включением ~/.fonts

> 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 

открыт ("/ главная/user1/.fonts/TTF/verdana.ttf", O_RDONLY) = 11
открыт ("/ главная/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

и показать, как тот же пользователь, так что я подозреваю, что это вводит в заблуждение, потому что это работает отлично (шрифты и все) в оболочке:

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 может позволить пользователям EXEC программу с правами ее владельца (user1), но это не помогает. Этот конкретный сервер является общим сервером, а su и sudo отключены так, что другой пользователь не разрешен.

Конфигурации пользователей Linux не являются моей областью знаний, но с использованием exec(), как запустить команду PhantomJS, чтобы пользовательские шрифты были включены?


Исследование:

+0

Исправить меня, если я ошибаюсь - проблема возникает только при загрузке скрипта через веб-сервер (выполнение командной строки работает правильно)? Если да - я бы сказал, что проблема может быть связана с неинтерактивной оболочкой. – radmen

+0

@radmen Да, проблема возникает только с 'exec()'. Я ожидал, что PHP должен работать как 'www-data', но' exec ('whoami') 'возвращается с повышенным пользователем user1. Однако, хотя whoami говорит, что скрипт выполняется как user1, он не имеет доступа к пользовательским шрифтам, что является моей конечной целью использования PhantomJS через 'exec()'. – Drakes

+0

PHP имеет нечто вроде 'shell_exec()' он может вести себя немного иначе, чем 'exec()' - возможно, попробуйте это? – radmen

ответ

0

Проблема проявилась, когда printenv и exec('printenv') запускались, соответственно

HOME=/home/user1 

и

HOME=/home/user1/tmp 

Это означает, что даже если whoami и exec('whoami') возвращают user1, что-то в общем хозяине конфигурация устанавливает домашний каталог в /tmp, что является разумным для песочницы сценария.

Решение состоит в том, чтобы предварять export HOME=~; (не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 быть установлены и шрифты пользователя теперь можно искать.