Блог инженера-программиста / шапку скоро поменяю /

Удаленно перезагружаем Apache и MySQL

Чего мы только не делаем ради того, чтоб ничего не делать. Ситуация: есть сервер под Win2003, на котором работают Apache, MySQL, Serv-U. Периодически древний индеец вешается, причем в основном если обращение идет с клиента под Win98. Казалось бы простое решение — снести нафиг Win2003, поставить linux, настроить сервисы и нет проблем (а может просто Apache 2 поменять на Apache 1.3?). Нет, мы пойдем не таким путем (лень восстанавливать moodle на новом сервере).

Цель — создать скрипт, который каким-то образом перезагрузит Apache и MySQL (на всякий случай). Итак, поехали.

У многих «оконных админов» скорее всего уже давным давно готов bat-файлик примерно с таким содержанием:

1
2
3
4
net stop mysql5
net stop apache2
net start mysql5
net start apache2

У кого нет, объясню: останавливаем MySQL и Apache и запускаем их снова. Наша цель удаленно послать команду на запуск этого bat-файла.

У фтп-сервера есть возможность выполнять команды на машине, где он установлен (для этого пользователь, от имени которого подключились должен иметь права для запуска файлов (в Serv-U это называется Allow client to execute file on server as Windows programm)). Задача свелась к созданию скрипта, который подключится к FTP-серверу и пошлет ему команду на запуск bat-файла (его предусмотрительно ложим в папку, на которую пользователю даем права). Подключаться будем с паролем, который конечный пользователь введет в поле на странице.

Получился такой код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (isUser())
{
  /* Соединение с FTP сервером */
  $serv="site.ru";
  $port="2121";
  $conn = ftp_connect($serv,$port);
  if (!$conn) die('<span class="error">Не удалось подключиться к '.$serv.'</span>');

  /* Вход под именем "user" с паролем $_POST["pass"] */
  if (!ftp_login($conn, 'user', $_POST["pass"]))
      die('<span class="error">Не удалось войти на '.$serv.':'.$port.'</span>');

  /* Отправка команды на запуск bat-файла FTP серверу */
  if (ftp_site($conn, 'EXEC restart_server.bat')) echo "<span class='ok'>Перезагрузка запущена.</span>\n";
    else echo("<span class='error'>Перезагрузка не запущена.</span>\n");
  ftp_close($conn);
}

Так как скрипт будет висеть в доступном месте, нужно хоть немного его защитить. Для этого и нужна функция isUser():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function isUser()
{
  if (isset($_POST["pass"]))
  {
    if (isset($_SESSION["passtime"]) && (time()-$_SESSION["passtime"])&lt;11)
    {
      $_SESSION["passtime"]=time();
      print "<span class='error'>Повторную попытку доступа можно повторить не раньше чем через 10 секунд!</span>";
      return false;
    }
    $_SESSION["passtime"]=time();
    return true;
  }
  else return false;
}

Она проверяет, заполнено ли поле с паролем, и ограничивает попытки входа 1 раз на 10 секунд.

Все, вешаем на какой-нибудь доступный сервер (не забыв добавить форму для ввода пароля и старт сессии) и наслаждаемся :)

P.S. Для совсем ленивых — готовый скрипт + bat-файл.

Комментарии на: "Удаленно перезагружаем Apache и MySQL" (11)

  1. Собрат said:

    >> Задача свелась к созданию скрипта, который подключится к FTP-серверу и пошлет ему команду на запуск bat-файла

    Та же проблема, но в php я не в зуб ногой. =..(
    Тоже Serv-U на сервере, тоже необходим запуск батников по фтп. Нигде не могу найти инфу по этому вопросу, фтп-клиенты (по крайней мере TotalCommander фитчи удаленного запуска не поддерживают).

    Чем можно запустить?! (естес-но имеючи все необходимые права)

    • Инженер said:

      Total Commander умеет удаленно запускать bat-файлы.
      Положите в папку restart_server.bat, дайте права пользователю, которым Вы подключаетесь для запуска и выполните в командной строке тоталкоммандера:
      EXEC restart_server.bat
      Команда EXEC-удаленный запуск файла.

      • Собрат said:

        Пишет в логе командера:

        CWD EXEC Restart_FTP.bat
        550 /EXEC Restart_FTP.bat: No such file or directory.

        или

        CWD EXEC 0:/Restart_FTP.bat
        550 /EXEC 0/Restart_FTP.bat: No such file or directory.

        в зависимости от указания полного пути или краткого.

        Хотя прекрасно видит и качает файл, если печатать название без EXEC

  2. Инженер said:

    По-моему ошибка 550 — недостаточно прав. Думаю, не установлены права для запуска в ServU для usera, которым подключаетесь к ftp.

  3. Собрат said:

    Галочка на право запуска стоит.
    Проверил и с дополнительным доступом от прав юзера в винде (которые соответсвуют и NTFS правам того же юзера в каталоге).

    Все же грешу на TotalCommader — качать с командной строки он тоже отказывается (моя ошибка в сообщении выше — недоглядел)

    Есть способ сваять батник (или *.js) для клиента?

    В принципе в финале, на каждый набор команд планировался отдельный юзер, залоченный в своем каталоге и с правом _только_ на запуск батников, так что безопасность не сильно пошатнется.

    • Инженер said:

      Возможно, у Вас не Serv-u??? Для Serv-U нужно установить Allow client to execute file on server as Windows programm

      По поводу батника для клиента — а смысл? Я так понял, батник должен выполняться на сервере? Если на сервере, а запускать должен был клиент — посмотрите пример php скрипта выше — скрипт лежит на сервере, подключается к серверу по ftp и запускает батник на выполнение. Сам скрипт может запускать юзер.

      Но если все-таки проблемы с правами — тут скрипт не поможет.

      • Собрат said:

        serv-u 9.0.0.5
        Не дословно так, как Вами написано (больше года назад руссифицировал =))
        Но что разрешение есть, даже предупредительное сообщение каждый раз вылазит при установке флага.

        Выполняться должно на сервере, а запускает клиент — верно.

        Почему не php? Опыт работы с ним практически нулевой. Следовательно, нет и сервера php под рукой, как и желания (да и лишнего ресурса) его поднимать.

        Вот и возникла идея, выдать клиенту отдельный батник или *.js-скрипт, которым он может заставить стартовать батники на сервере.

  4. Инженер said:

    Тогда придется как-то придумать и реализовать подключение из bat или js скрипта клиента подключение к ftp, запуск команды exec, что будет очень сложно — проще поднять apache+php.

    Единственное, что могу посоветовать — посмотрите консольные клиенты ftp (например стандартный виндовый ftp), возможно получится через него запустить, тогда команды, написанные для него можно внести в батник для юзера.

  5. Собрат said:

    Стандартный клиент сработал (windows ftp)!
    После подключения к серверу и ввода логина-пароля буквально одной строкой:

    quote site exec restart.bat

    где:
    [quote] — позволяет отправлять любую произвольную команду серверу.
    [site exec] — интуитивно, т.к. просто «exec» он не понял
    [restart.bat] — любое имя файла в каталоге.

    Соответственно, процесс подключения + команды легко переселяются в bat.

    Спасибо Вам огромное, что помогли разобраться!
    Может, еще кому-нибудь пригодится. =)

    P.S. И небольшой подводный камень напоследок: Таким образом невозможно перезапустить сам serv-u — батник остановил службу корректно, а поднять обратно — уже нет.
    Но тут, как понимаю, уже особенность обработки батников самим serv u. Т.е. выполняет не оболочкой винды, а так сказать «собой». Но это уже мелочи :)

    • Инженер said:

      Отлично, что получилось, странно, что TC не захотел. Может быть тоже SITE EXEC попробовать?

      • Собрат said:

        Тоже попытался, но нет.
        TC к началу всех рукописным команд принудительно добавляет «CWD «, что вполне отчетливо заметно в логах.

        //А может, это только у меня он такой глючный..
        // QUOTE SITE EXEC в нем тоже не подействовало xD