Раньше, пока сервера были на винде, разбирался с этим, и даже что-то работало. Сейчас по ssh это делается в одно касание, так что даже не пробовал писать скрипт. Вот два варианта. Сервер запущен в виде службы через программу fire daemon.
Первый способ - создаём батник с нужным содержимым, выполняем его, а затем удаляем. Не самый быстрый способ, но я тоже не сразу разобрался с exec. Скрипт написан с тем учетом, что веб сервер и игровой сервер находятся на разных машинах с разными айпишниками. Если они находятся в одном месте, и если батник уже готов и его не надо генерировать, то скрипт можно написать в 3 строчки.
$str - это ip + port нашего сервера. порт в данной процедуре не нужен, так что он отбрасывается.
$comm - это команда для службы (stop/start).
$service - это название сервиса, который у нас связан с игровым сервером.
$login и $password - это логин и пароль удалённой машины с игровым сервером, от чьего имени будут выполняться команды в батнике.
Код
$lists = explode(":", $str);
$server = $lists[0];
$direct = "_scripts\\";
$filename = $comm.".bat";
$command = "net use \\\\".$server."\\IPC$ \"".$password."\" /user:".$server."\\".$login."\r\n".
"sc \\\\".$server." ".$comm." ".$service."\r\n".
"net use \\\\".$server."\\IPC$ /delete /yes \r\n".
"exit";
$handle = fopen($direct.$filename, "w");
fwrite($handle, $command);
fclose($handle);
$real_path = realpath($direct.$filename);
$center_section = $real_path;
if (exec($real_path)){
$center_section = "
<fieldset>
<legend>
<font color=green>
<b>Сообщение</b>
</font>
</legend>Операция $comm для сервера $str успешно выполнена!
</fieldset>
";
} else {
$center_section = "
<fieldset>
<legend>
<font color=red>
<b>Ошибка</b>
</font>
</legend>Операция $comm для сервера $str не выполнена!
</fieldset>
";
}
unlink ($direct.$filename);
echo $center_section;
Т.е. в папке _scripts создаётся бат файл, который содержит команду для удалённой машины, который выполняется, а затем удаляется.
Второй способ - послать команду серверу напрямую.
Код
$command2 = "net use \\\\".$server."\\IPC$ \"".$password."\" /user:".$server."\\".$login;
$command3 = "sc \\\\".$server." ".$comm." ".$service;
$issuccess2 = exec($command2,$res2);
$issuccess3 = exec($command3,$res3);
if ($issuccess3){
$center_section = "
<fieldset>
<legend>
<font color=green>
<b>Сообщение</b>
</font>
</legend>Операция $comm для сервера $str успешно выполнена!
</fieldset>
";
} else {
$center_section = "
<fieldset>
<legend>
<font color=red>
<b>Ошибка</b>
</font>
</legend>Операция $comm для сервера $str не выполнена!
</fieldset>
";
}
echo $center_section;
На счёт второго способа не уверен, в рабочей ли конфигурации он сейчас, но первый с батником точно работает. Не знаю, поможет ли вам это, но думаю как минимум может дать направление =)
P.S. я новичок в этом деле, и если у кого есть более оптимальные способы решения, то отпишитесь, будет полезно узнать =)
Отредактировал: x@kep, - 10.4.2011, 2:09