Чего мы только не делаем ради того, чтоб ничего не делать. Ситуация: есть сервер под 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"])<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-файл.
>> Задача свелась к созданию скрипта, который подключится к FTP-серверу и пошлет ему команду на запуск bat-файла
Та же проблема, но в php я не в зуб ногой. =..(
Тоже Serv-U на сервере, тоже необходим запуск батников по фтп. Нигде не могу найти инфу по этому вопросу, фтп-клиенты (по крайней мере TotalCommander фитчи удаленного запуска не поддерживают).
Чем можно запустить?! (естес-но имеючи все необходимые права)
Total Commander умеет удаленно запускать bat-файлы.
Положите в папку restart_server.bat, дайте права пользователю, которым Вы подключаетесь для запуска и выполните в командной строке тоталкоммандера:
EXEC restart_server.bat
Команда EXEC-удаленный запуск файла.
Пишет в логе командера:
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
По-моему ошибка 550 — недостаточно прав. Думаю, не установлены права для запуска в ServU для usera, которым подключаетесь к ftp.
Галочка на право запуска стоит.
Проверил и с дополнительным доступом от прав юзера в винде (которые соответсвуют и NTFS правам того же юзера в каталоге).
Все же грешу на TotalCommader — качать с командной строки он тоже отказывается (моя ошибка в сообщении выше — недоглядел)
Есть способ сваять батник (или *.js) для клиента?
В принципе в финале, на каждый набор команд планировался отдельный юзер, залоченный в своем каталоге и с правом _только_ на запуск батников, так что безопасность не сильно пошатнется.
Возможно, у Вас не Serv-u??? Для Serv-U нужно установить
Allow client to execute file on server as Windows programm
По поводу батника для клиента — а смысл? Я так понял, батник должен выполняться на сервере? Если на сервере, а запускать должен был клиент — посмотрите пример php скрипта выше — скрипт лежит на сервере, подключается к серверу по ftp и запускает батник на выполнение. Сам скрипт может запускать юзер.
Но если все-таки проблемы с правами — тут скрипт не поможет.
serv-u 9.0.0.5
Не дословно так, как Вами написано (больше года назад руссифицировал =))
Но что разрешение есть, даже предупредительное сообщение каждый раз вылазит при установке флага.
Выполняться должно на сервере, а запускает клиент — верно.
Почему не php? Опыт работы с ним практически нулевой. Следовательно, нет и сервера php под рукой, как и желания (да и лишнего ресурса) его поднимать.
Вот и возникла идея, выдать клиенту отдельный батник или *.js-скрипт, которым он может заставить стартовать батники на сервере.
Тогда придется как-то придумать и реализовать подключение из bat или js скрипта клиента подключение к ftp, запуск команды exec, что будет очень сложно — проще поднять apache+php.
Единственное, что могу посоветовать — посмотрите консольные клиенты ftp (например стандартный виндовый ftp), возможно получится через него запустить, тогда команды, написанные для него можно внести в батник для юзера.
Стандартный клиент сработал (windows ftp)!
После подключения к серверу и ввода логина-пароля буквально одной строкой:
quote site exec restart.bat
где:
[quote] — позволяет отправлять любую произвольную команду серверу.
[site exec] — интуитивно, т.к. просто «exec» он не понял
[restart.bat] — любое имя файла в каталоге.
Соответственно, процесс подключения + команды легко переселяются в bat.
Спасибо Вам огромное, что помогли разобраться!
Может, еще кому-нибудь пригодится. =)
P.S. И небольшой подводный камень напоследок: Таким образом невозможно перезапустить сам serv-u — батник остановил службу корректно, а поднять обратно — уже нет.
Но тут, как понимаю, уже особенность обработки батников самим serv u. Т.е. выполняет не оболочкой винды, а так сказать «собой». Но это уже мелочи
Отлично, что получилось, странно, что TC не захотел. Может быть тоже SITE EXEC попробовать?
Тоже попытался, но нет.
TC к началу всех рукописным команд принудительно добавляет «CWD «, что вполне отчетливо заметно в логах.
//А может, это только у меня он такой глючный..
// QUOTE SITE EXEC в нем тоже не подействовало xD