Запуск Shell Script со страницы PHP - PullRequest
0 голосов
/ 05 ноября 2018

Что я хотел бы сделать:

Когда просматривается mydomain.com/index.php, запустите скрипт, который входит в систему на другом компьютере (отличном от того, который обслуживает index.php) в локальной сети сервера и запускает скрипт Python.

Что у меня пока есть:

В index.php я звоню

shell_exec('/var/www/dir/save.sh '.$ARG1.' '.$ARG2);

Сценарий save.sh:

#!/usr/bin/expect -f
set cmd "python /path/to/python_script.py"
set file [lindex $argv 0]
set content [lindex $argv 1]

spawn ssh usr@local_ip "$cmd $file $content"
expect "assword:"
send "PWD\r"
interact

Я запустил sudo chmod www-data+x save.sh, чтобы разрешить PHP-сайту запускать команду. Когда я запускаю sudo -u www-data ./save.sh arg1 arg2 в терминале, все работает как положено, и я вижу вывод python_script.py (который я печатаю для тестирования).

Однако, при вызове index.php и повторении вывода shell_exec -Call, я вижу все до user@ip's password:, но не вывод python_script.py, и я могу проверить, что скрипт не был запущен на другом компьютере.

Есть идеи, чего мне не хватает? Я рад за любую помощь! :)


UPDATE

Спасибо за быстрые ответы. Извините, что не прояснил себя достаточно.

Прежде всего: не используется для публичного / коммерческого / сложного веб-сайта, а скорее для частного удовольствия, а mydomain.com заблокировано auth_basic.

Моя настройка: Server1 хостинг mydomain.com. Server2 запускает некоторые вещи для частного развлечения, например ПО для умного дома и боты Telegram.

Что я хочу сделать: при вызове mydomain.com/index.php я хочу сохранить те же параметры (на самом деле просто True или False) в Server2, чтобы использовать их для некоторых работающих там сценариев. Server1 и Server2 находятся в одной локальной сети, но только Server1 доступны извне, поэтому идея войти в систему через SSH и запустить Python-Script.

Я ценю любые советы о том, как сделать это лучше или заставить работать мое целевое решение. :)


ОБНОВЛЕНИЕ 2:

Спасибо symcbean за указание на ошибки в скрипте. Я должен признать, что я скопировал и вставил его из других потоков stackoverflow.

Спасибо также ADyson за указание лучших способов решения проблемы. Я обязательно запомню их для более крупных проектов.

Тем временем я смог запустить скрипт. Он все еще очень прост, не отслеживает исключение скрипта Python и не обрабатывает ошибки. Опять же, я не хочу указывать, что я использую это только для частного использования, и mydomain.com/index.php будет работать только в течение ограниченного времени (это будет календарь andvent и будет отключен после xmas). Но для полноты картины вот что я придумал:

#!/usr/bin/expect -f
set cmd "python /path/to/python_script.py"
set file [lindex $argv 0]
set content [lindex $argv 1]

spawn ssh usr@local_ip
expect "assword:"
send "PWD\r"
expect "*\$ "
send "$cmd $file $content\r"
expect "*\$*"
send "exit\r"
interact

1 Ответ

0 голосов
/ 05 ноября 2018

Оставляя в стороне специфические варианты выбора до того, как вы дойдете до этой точки, что именно вы ожидали, когда сценарий ожидаемого значения достигнет

interact

В вашем сценарии оболочки нет ничего, чтобы запускать сценарий python, ни отслеживать его выполнение, ни выходить из оболочки. Тем временем ваш PHP-код блокируется до выхода из локального скрипта.

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

...