Проблема. Изначально через командную строку в качестве пользователя root я обратился к пакету pandoc (/root/.cabal/bin/pandoc)
который был установлен в корневой папке. Когда я пытаюсь получить доступ к этому пакету через php с помощью shell_exec()
, он терпит неудачу.
Вопрос: Существует ли ограничение для php shell_exec()
не для доступа к корневым пакетам в целях безопасности? Если да, то как его решить?
Я попробовал: дал разрешение на запись в корневую папку, тогда я мог обращаться к корневым пакетам через командную строку не как пользователь root. но я не смог получить к нему доступ через php shell_exec()
.
PHP-код:
shell_exec("cd /home/quotequadsco/public_html/pandoc_jats ; sudo -u quotequadsco
-S /root/.cabal/bin/pandoc ex.tex --filter /root/.cabal/bin/pandoc-citeproc
-t JATS.lua -o ex.xml");
а также попробовал,
shell_exec("cd /home/quotequadsco/public_html/pandoc_jats ;/root/.cabal/bin/pandoc
ex.tex --filter /root/.cabal/bin/pandoc-citeproc -t JATS.lua -o ex.xml");
Ожидание: мне нужно выполнить пакет pandoc root через shell_exec()
в php.
Добавлена следующая строка в файле /etc/sudoer
#Defaults requiretty //commented this line
usergroup ALL=(ALL) ALL
PHP-код,
shell_exec("cd /home/quotequadsco/public_html/pandoc_jats ;echo password | sudo
-S command"); //added a password for sudo command to run as a root user.
Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash (по запросу root), она решает ограничения exec() и shell_exec(). Получить его здесь: https://github.com/merlinthemagic/MTS
После загрузки вы просто используете следующий код:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1 = $shell->exeCmd('pandoc (/root/.cabal/bin/pandoc)');
//the return will be a string containing the return of the command
echo $return1;