Как безопасно выполнить команду на другом сервере?
Есть задача выполнять одну команду на сервере, но с разными параметрами, которые формируются на другом сервере.
Есть подозрения, что exec($_GET['command']); плохая идея))
Вторая мысль - разбить параметры команды на составляющие и передавать отдельно, потом экранировать, собирать в команду и тогда выполнять.
При этом, допускается вероятность взлома или открытых исходников первого.
Задача в том, чтобы злоумышленик, зная исходный код принимающего скрипта не смог выполнить на принимающем сервере ничего кроме изначально исполняемой команды.
Вопроса два:
1) Если разбивать на отдельные параметры, то что нужно заэкранировать во входящих данных, чтобы не получилось инъекции (завершаем команду, например | этим символом и пишем в продолжение что угодно)
2) Может быть есть альтернативный способ безопасно выполнять команды с одного сервера на другом? (Сертификаты, ключи или прочая магия)
я бы использовал фишку с чек-суммой строки, как при платежах. открытый код команды (можно зашить в base64) и отдельной переменной хеш. а на принимающей стороне смотреть уже верный хеш иль нет.
Deployer
Но ключ - это уровень настройки серверов и там все достаточно просто: один ключ приватный лежит у юзера на сервере A и публичный ключ лежит на управляемом сервере B. Все как при обычном коннекте на любой сервер по SSH. Если команда не требует прав рута, так вообще отлично. Просто заходить под нужным пользователем по ключу.
Можно взять библиотеку Symfony Console и дописать свои команды. Я сейчас как раз пишу приложение на PHP для настройки сервера: https://github.com/oxboot/ox/tree/develop
Серваки соединены в одну локаль?
ЕСли да то по ssh.
Вот например у меня крон задание висит с одного сервака на другой:
@reboot ssh 192.168.1.1 'mysqladmin flush-hosts -pkWz46ezyRc' >/dev/null 2>&1
где 192.168.1.1 - локальный айпи другого сервака где выполнить команду mysqladmin flush-hosts
Да даже если не соединены то точно так же с указанием пароля и тд. И на том серваке открыть доступ с айпи другого сервера для ssh