Первоначально я задал этот вопрос 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 каждую минуту. Он проверяет наличие текстовых файлов в первом каталоге. Если они существуют, он запускает другой сценарий для развертывания экземпляров, затем удаляет все текстовые файлы в каталоге, иначе завершается.
Я провел простые тесты, и это жизнеспособное решение. Теперь мне просто нужно применить полученные знания и расширить их, пока проект не будет завершен.