Как создать API некоторых команд оболочки и разрешить доступ к ним через PHP? - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу выполнить на моем сервере некоторые задачи, требующие доступа к корневой оболочке.Я хочу сделать простой API, к которому я могу получить доступ из PHP.

То, чего я хочу достичь:

  • клонировать из одной базы данных в другую.Базы данных принадлежат разным пользователям:

    mysqldump -h localhost -u SOURCE_USER -pSOURCEPASSWD SOURCE_DB | mysql -h localhost -u DEST_USER -pDEST_PASS DEST_DB

  • копирование файлов от одного пользователя public_html другому:

    cp -R SOURCE_DIR DEST_DIR

У меня есть рабочие bash-скрипты для обеих этих задач.

Я не хочу предоставлять PHP полный root-доступ к серверу, поскольку это было бы сумасшествием, но вместо этого:

Как мне сделать указанные bash-скрипты исполняемыми из PHP-файла в одном каталоге public_html пользователя linux?

В качестве альтернативы: Как я могупредоставить root-доступ (через shell_exec) к ОДНОМУ указанному PHP-файлу на сервере.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Вы можете использовать этот проект: Github .Это позволяет PHP получать и взаимодействовать с реальной оболочкой Bash даже в качестве пользователя root без запуска веб-сервера в качестве пользователя root.

После компоновки / загрузки вы просто используете следующий код:

//read the documentation: here you get a root shell if you allowed sudo
$shellObj    = \MTS\Factories::getDevices()->getLocalHost()->getShell("bash", true);

//OR if you did not want to give the webserver sudo access, then you can use this syntax:
$shellObj       = \MTS\Factories::getDevices()->getLocalHost()->getShell("bash", false);
\MTS\Factories::getActions()->getRemoteUsers()->changeUser($shellObj, 'root', 'rootPassword');

//In both cases you now have a shell as root. This really is a bash shell, its not just wrapping the PHP shell functions.

//All you have left is to issue commands just like you would on a bash prompt
$strCmd = "mysqldump -h localhost -u SOURCE_USER -pSOURCEPASSWD SOURCE_DB | mysql -h localhost -u DEST_USER -pDEST_PASS DEST_DB";

//for the vast majority of commands that finish within 10 sec you need only issue the command
$return  = $shellObj->exeCmd($strCmd);
echo $return;// return from your command

//However if your command runs for more than 10 sec, you must set a timeout. e.g.
//timeout in miliseconds
$timeout = 20000;
$return  = $shellObj->exeCmd($strCmd, null, $timeout);
echo $return;// return from your command

Не стесняйтесь вводить больше команд для $ shellObj, это оболочка bash, готовая принимать заказы, и, как я уже сказал, готовая документация.

0 голосов
/ 20 сентября 2018

После полезного комментария от arkascha я исследовал sudo и нашел ответ Ezequiel Hdez в sudo в php exec () , чтобы найти ответ на мой вопрос:

Разрешитьmyuser для sudo моего сценария оболочки, добавив sudoers file (откройте его, введя visudo):

myuser ALL = NOPASSWD: /path/to/myscript.sh

Сделайте сценарий исполняемым:

chown u+x /path/to/myscript.sh

Затем в PHP (от "myuser")

exec("sudo /path/to/myscript.sh argument1 argument2"); 

Теперь я мог делать все, что захочу из PHP, но ТОЛЬКО через /path/to/myscript.sh

...