Назад | Перейти на главную страницу

Как запустить php exec для вложенных скриптов на удаленных машинах?

Первоначально я задал этот вопрос stackEx и понял, что он здесь намного лучше.

Я пытаюсь автоматизировать развертывание сервисов на кластере хостов с веб-сервера. Раньше я вызывал функцию php exec для запуска простых скриптов, и это не было проблемой; однако кажется, что сложность моей текущей задачи требует дальнейшей настройки.

Я поменял ssh-ключи между хостами и веб-сервером. Это скрипт, привязанный к php exec как кнопка:

  # store free memory text as variable


a="/root/pl3bs/a.txt"
b="/root/pl3bs/b.txt"
c="/root/pl3bs/c.txt"

amem=$(cat "$a")
bmem=$(cat "$b")
cmem=$(cat "$c")

# run script on host which has most free memory

if   [ "$cmem" -gt "$amem" ] && [ "$cmem" -gt "$bmem" ]

  then
        ssh 'pl3bs@<ip_redacted>' 'bash -s' < /home/deploy.sh

elif [ "$amem" -gt "$bmem" ] && [ "$amem" -gt "$cmem" ]

  then
        ssh 'pl3bs@<ip2_redacted>' 'bash -s' < /home/deploy.sh

else [ "$bmem" -gt "$amem" ] && [ "$bmem" -gt "$cmem" ]

        ssh 'pl3bs@<ip3_redacted>' 'bash -s' < /home/deploy.sh


fi

Итак, я знаю, что это запускается пользователем www-data, и я знаю, что есть проблемы с разрешениями и риски безопасности при использовании этого пользователя для запуска сценариев. Я пытаюсь сделать это правильно. Я скопировал каталог /root/.ssh в каталог /var/www/.ssh, который я создал, подключил его к www-data, поставил 700 разрешений на папку и 600 для файла authorized_keys. Он все еще не запускает мой скрипт с помощью кнопки php.

Если я запустил это в оболочке с помощью:

sudo -u www-data ./instance.sh

Запрашивает пароль. Я поменял ключи с хостов на веб-сервер и наоборот, прежде чем копировать ключи из /root/.ssh в /var/www/.ssh, так почему это все еще происходит? Я знаю, что пользователь www-data специально ограничен по какой-то причине, поэтому я думаю, что нужно сделать что-то еще? Как мне заставить этот скрипт работать, не вызывая бреши в безопасности?

Я был одержим этим уже почти 24 часа, и мне нужно решение. Пожалуйста, даже если вы скажете мне начать с нуля и пойти другим путем, помогите мне.

Спасибо.

Мое теоретическое решение было успешным. У меня есть папка, в которой будут храниться текстовые файлы, введенные пользователем. У меня есть папка для сценариев в другом месте на сервере, к которой имеет доступ только root, и она запускается через cronjob каждую минуту. Он проверяет наличие текстовых файлов в первом каталоге. Если они существуют, он запускает другой сценарий для развертывания экземпляров, затем удаляет все текстовые файлы в каталоге, иначе завершается.

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