У меня появилась задача по организации оперативного выключения удаленных серверов в один клик. Причем выключать сервера должны разнообразные пользователи, в том числе и без знаний и понимания принципов работы сервера. То есть они должны просто нажать кнопку, чтобы сервер автоматически завершил свою работу.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Причем выключать по сети нужно как windows серверы, так и linux различных дистрибутивов - ubuntu, centos, freebsd. То есть решение должно быть простое и надежное.
Дистанционное выключение Windows сервера
Начнем с самого сложного. На практике реализовать надежный способ выключения windows машин по сети для меня оказалось сложнее, чем linux. Методов и подходов к решению данной задачи много. Я пробовал разные варианты и остановился на одном, который мне показался самым надежным, он сработал без проблем во всех случаях во время тестирования.
Обязательным условием удаленного выключения сервера является сетевой доступ к нему по rdp. Вы можете находится в локальной сети с ним, подключиться по vpn или пробросить rdp соединение редиректом со шлюза. Не важно, главное попасть в систему по rdp.
Принцип работы удаленного отключения следующий:
- На компьютере или сервере создается пользователь, которому будет разрешено подключаться по rdp и завершать работу сервера.
- В автозагрузке этого пользователя будет скрипт для завершения работы.
- Пользователям, которые будут удаленно выключать сервер, дается специально подготовленный rdp клиент, который без всяких запросов будет подключаться нужным пользователем, у которого будет срабатывать скрипт на завершение работы.
Все достаточно просто, но на каждом этапе я сталкивался с проблемами, которые требовали не тривиального решения. Но обо все по порядку.
Итак, идем на север и создаем там простой bat файл следующего содержания:
shutdown /p /d p:0:0 /f
Сохраняем файл и создаем пользователя, под которым будем выключать сервер. Не забудьте добавить этому пользователю разрешение подключаться по rdp. Если вы выключаете компьютер с десктопной системой, то прав обычного пользователя достаточно. Если же вам надо погасить Windows Server, то пользователя нужно либо сделать админа, либо дать ему права на разрешение выключение сервера через локальную политику безопасности. Живет эта политика по адресу - параметры безопасности - локальные политики - назначение прав пользователей - завершение работы системы.
Вот тут я напоролся на первые неприятности. Я назвал свой скрипт shutdown.bat и очень долго не мог понять, почему он не срабатывает. При вводе команды shutdown с параметрами в консоли все отлично работало, но скрипт не запускался. Оказывается, его нельзя называть таким именем. После того, как переименовал в shut.bat, все отлично заработало. Какая-то нелепая загвоздка, но мне пришлось потратить немало времени, пока я разобрался, в чем тут дело.
Дальше заходим нашим новым пользователем, чтобы создались стандартные папки профиля и кладем скрипт автовыключения сервера ему в автозагрузку - C:\Users\shut-user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup.
Теперь нам нужно настроить автоматический вход пользователя по rdp, чтобы выполнить удаленное завершение работы. Причем пользователь должен заходить на сервер без запроса имени и пароля. Штатными средствами rdp клиента windows это сделать невозможно. Даже если вы сохраните параметры, то при переносе настроек на другой компьютер нужно будет снова вводить пароль. Мне это не подходило.
Я пробовал использовать старую портированную версию rdp 5.2. Это последняя версия, где пароль в зашифрованном виде можно было хранить в файле настроек. Но при переносе этого файла на другой компьютер, все равно выскакивало окно с вводом пароля. Добиться полного автоматизма не получалось.
Но решение было найдено. Существует любопытный проект Remote Desktop Plus, который является надстройкой над rdp. С помощью этой надстройки можно передать параметры в rdp через командную строку, в том числе и имя пользователя с паролем. Мне это полностью подходит. Скачиваем файлик rdp.exe либо с сайта автора проекта, либо с моего. Я скопировал на всякий случай эту очень полезную утилиту. Кладем его в папку и создаем в этой же папке rem-shut.bat файл следующего содержания:
rdp.exe /v:10.10.5.14 /u:shut-user /p:pass123 /w:640 /h:480
10.10.5.14 | адрес удаленного сервера |
shut-user | пользователь rdp от имени которого будет происходить выключение |
pass123 | пароль пользователя |
640 480 | параметры разрешения экрана, можно не указывать |
Всего этого достаточно, чтобы выполнить дистанционное завершение работы на windows сервере. Пользователю необходимо передать 2 файла:
- rdp.exe
- rem-shut.bat
Важно, чтобы они лежали в одной папке. При запуске батника произойдет подключение rdp пользователя и выполнится скрипт завершения работы. Задача выполнена.
Удаленное выключение linux сервера
Здесь все оказалось значительно проще. Сразу же было найдено рабочее решение, которое позволяет без проблем удаленно выключить любой linux сервер. Задача решается стандартными средствами putty. Эту программу можно запускать из командной строки с параметрами. В качестве параметров можно указать файл с командами для выполнения, адрес сервера, пользователя и пароль.
Подготовим все необходимое. Сначала создаем простой текстовый документ shutdown.txt следующего содержания:
shutdown -h now
Дальше создаем bat файл serv-rem-shut.bat с таким содержимым:
putty.exe -m shutdown.txt -ssh -P 22 -l root -pw rootpass 10.10.5.15
shutdown.txt | текстовый файл с командой на отключение |
22 | номер порта ssh |
root | имя пользователя, от которого будет выполняться команда на удаленное выключение, лучше создать отдельного |
rootpass | пароль этого пользователя |
10.10.5.15 | адрес linux сервера |
Передаем пользователю 3 файла, сложенные в одну папку:
- putty.exe
- shutdown.txt
- serv-rem-shut.bat
Теперь при запуске скрипта serv-rem-shut.bat серверу по сети будет отправлена консольная команда на завершение работы. При этом не будет задано никаких вопросов. Сервер просто молча выключится.
Заключение
Вот такие нехитрые способы были мной придуманы и реализованы. Тут еще важно обеспечить доступ к локальной сети, в которой живут серверы. В моем случае openvpn позволяет выполнить удаленное выключение компьютеров даже через интернет.
Уверен, существует множество других возможностей погасить сервер удаленно. Буду рад, если в комментариях со мной кто-нибудь поделится своими идеями и опытом на этот счет.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
спс статья очч помогла. Самая полезная и доступная и всего мусора что есть в сети.
Только вот на UBUNTU 14, 16, 18 - не работает так как есть
Во первых прописал права юзеру на отключение без пароля (хотя пароль и посылается в команде 0 но то пофиг если сервер ставился с пользователя, и рут отключен. Ведь ваш скрипт-команда тупо на управление рутом расчитана)
права дал в sudoers шото типа
user ALL = NOPASSWD: /sbin/shutdown, /sbin/reboot, /sbin/poweroff
а в файле команду надо отправлять через судо.
файл shutdown.txt с содержимым: sudo shutdown -h 0
и так заработало )
Добрый день, Владимир. Статья отличная, огромное спасибо. У меня такая проблема, есть несколько физических серверов, а на них виртуальные. К одному физическому серверу с ИБП подаётся команда на выключение. Задача такая, когда сервер получает команду shutdown с ИБП он должен отправить команду по сети на другие сервера на отключение, как можно это организовать?
А какой софт работает с ИБП? Я делал такое с УПС от APC, используя программу apcupsd. Если у вас что-то другое, то помочь не смогу.
Powerchute. Хотел при помощи События от Батареи запустить бат-файл, но не получается. Было бы здорово если бы Вы поделились своим опытом работы, у нас УПС тоже от АРС.
Для APC хорошо работает apcupsd. Рекомендую попробовать ее и не придется колхозить скрипты. У меня описаны примеры использования этой утилиты - https://serveradmin.ru/ustanovka-i-nastroyka-apcupsd-na-xenserver/ , https://serveradmin.ru/ustanovka-i-nastroyka-apcupsd-na-hyper-v-server-2012-r2/ .
Спасибо. Буду пробовать.
Здравствуйте Владимир. Отличная статья, все просто и понятно, только не понятно, как можно из линукса например (CentOS) потушить доменный сервер windows?
Если в Linux есть графическое окружение, то так же - по rdp. А если нет, то надо думать. Так сходу в голову ничего не приходит.
Нашёл варианты. Буду пробовать. Задача "правильно" потушить сервера из под centos на малине, когда на неё поступит сигнал об отсутствии внешнего питания в течении NN минут. Ну и поднять сервера по питанию при его появлении. Powerchute не предлагать)))
Владимир, добрый день. не поможете решить проблему: хочу удаленно из интернета ВКЛЮЧИТЬ машину на дебиан, из локалки работает.
-есть фиксированный ИП адрес, на нём рутер, за рутером три компа - 2 на виндовс, один дебиан. Порты пробросил, обе видовс машины включаются, дебиан ни в какую - только из локалки включается.
Или может линукс-машина в принципе не может включаться из вне (здесь сомневаюсь, должно быть какое-то решение)?
Заходите на роутер через внешний интерфейс и с роутера посылайте wake-on-lan на debian сервер. Я такую связку использую. Вот пример описываю в статье - https://serveradmin.ru/ne-rabotaet-wake-on-lan-v-linux-kak-nastroit/
Владимир, спасибо за оперативный ответ. Для меня немного мудрёно. Как сто-то послать с рутера не разбирался, но скорее всего меня туда (в рутер) не пустят, рутер принадлежит провайдеру и у меня ограничены права.
Мне наверно проще просто запускать виндовс-машину и дать ей задачу автоматически будить линукс-машину. Это можно будет выполнить одним тыком в морду смартфона :)
Можно и так. Под windows есть программы, позволяющие слать пакеты wake on lan. Важно только, чтобы материнская плата с debian поддерживала пробуждение по сети. Обычно эти настройки в bios.
Машина с дебиан по сети будится из локалки, значит железо позволяет и настроено на пробуждение правильно. Вот интересно стало даже не то чтобы включить из интернета ( это криво, но можно сделать), а чем отличается ВЫКЛЮЧЕНЫЙ комп на котором стоит виндовс от компа на котором стоит линукс. В моём дилетантском понимании ничем - тогда почему не запускается?
Я тоже этого не знаю, но разница точно есть. Система как-то управляет тем, как компьютер выключается и в каком состоянии остается. Как раз такую ситуацию я описал по ссылке выше, когда у меня функционал wake-on-lan перестал работать после обновления системы.
Вопросик с Вашего позволения...
Если политика безопасности настроена таким образом, что авторизация под root-ом запрещена, как в txt сменить пользователя для выполнения команды?
Примерно вот так:
echo 'YhovrKhO44EI' | sudo -S poweroff
После echo идет пароль для повышения привилегий пользователя.
Спасибо за статью!
Использую ваш батник для выключения linux с машины windows(через агент APC, когда от ups прилетает сигнал выключения).
Когда putty теряет соединение с сервером появляется окно PuTTY Fatal Error "Server unexpectedly closed network connection", можно ли чтоб оно само закрывалось или вообще не появлялось?
Не знаю, как лучше сделать. Есть программы для windows, которые позволяют автоматизировать какие-то действия. Они могут по заголовку окна выделять его и что-то нажимать мышкой или клавиатурой. Думаю, можно что-то подобное приспособить закрывать окно. Но сейчас не вспомнил ни одного названия такой программы. У них обычно какой-то свой скриптовый язык для автоматизации действий за компьютером.
Добрый день. Вопрос. Возможно поможете. Заранее спасибо.
Есть ноутбук с Win 10. В настройках электропитания стоит действие при закрытии крышки - Завершение работы.
Когда ноут включен и не заблокирован, при закрытии крышки происходит завершение работы ноутбука.
НО - если заблокировать компьютер , ( ctr+alt+del) -заблокировать или сработает экранная заставка, то при закрытии крышки ноутбук не выключается и продолжает работать ( настройки электропитания стоят на максимальную производительность, от сети. без ухода в сон и гипернацию)
Если можете\сталкивались, помогите плииз.
Как заставить ноут завершать работу при закрытии крышки. На win 7 все работало отлично.
Кстати, не знаю. На семерке реально работало нормально, сам этим пользовался. Похоже просто на баг десятки.
(( примерно так ответили и в поддержке мелкософта ....
Доброго времени суток.
Было бы интересно узнать чем дополнить команду? для групповой перезагрузки linux машин. У винды список компов прописывается в отдельный файл и ребут идёт по порядку, но такая схема не прокатывает при запуске батника на linux машины, отрабатывает только последний IP.
Здравствуйте Zerox, я недавно столкнулся с линукс и еще не силен во всем этом, но есть вопросик, настраиваю музыкальный сервер, не будет ни клавы ни мышки ни монитора. Но нужно выключать линукс минт с мобильного, не подскажите как это настроить ? извеняюсь если что-то не корректно написал, за ранее спасибо
Можно на мобильный поставить ssh клиент, подключиться по сети к серверу и вручную выполнить команду на выключение.
Можно скачать утилиту plink.exe, это putty через командную строку, скачать можно с putty.org. Она позволяет отправлять команду по SSH в одну строку, без текстовых файлов.
Да, хороший вариант.
понятно, ок будет тогда через текстовый файл работать
Всем привет. Понравилась команда putty.exe -m shutdown.txt -ssh -P 22 -l root -pw rootpass 10.10.5.15 все работает как надо, но как сделать так чтоб из под винды батник запустить ив нем в место команды из текстового документа shutdown.txt , сразу полетела сама команда shutdown -h now
Это вопрос не к батнику, а к putty. Она не умеет брать команды из консоли, только из текстового файла. Отсюда и проблема. Я бы тоже хотел обойтись без лишних файлов.
а можно ещё использовать Bat_To_Exe_Converter и слепить из этих трех файлов полноценный exe
А вообше огромное спасибо автору. Классный сайт! Особенно статьи по Zabbix порадовали.
Удаленное выключение Windows PC в домене : C:\Windows\System32\shutdown.exe -m \\%IP -s -t 1 . Все проще гораздо. Можно оформить скриптом.
В домене я так и делаю, кстати. Мои скрипты получили продолжение - перезагружают компы и блочат учетки в домене. После перезагрузки в комп не войти. А тут нужно было погасить машину не в домене. Получилось, конечно, криво, но ведь надежно работает. С массовой командой shutdown.exe в домене тоже есть нюансы. Столкнулся, когда отладку делал и тестировал.
не в домене тоже не сложно
net use \\IP_adress (можно и просто имя ПК)
shutdown /s /t 0 /m \\IP_adress (можно и просто имя ПК)
Спасибо,добрый человек!
ssh root@192.168.1.1 0000 ‘reboot’
0000 - это пароль
Так?
В общем разобрался. Чтобы выключить машину Linux с машины Linux в одно касание нужно:
1. Настроить авторизацию по ключам (описано здесь http://rizloff.com/linux/ssh-login-without-password-use-authorized-keys )
2. Разрешение пользователю выполнять некоторые команды без ввода пароля. Сделать это можно поправив файл /etc/sudoers (описано здесь http://help.ubuntu.ru/wiki/%D1%81%D1%83%D0%BF%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_%D0%B2_ubuntu )
3. После этого сетевую машину можно перегрузить или выключить в одно касание (запроса пароля не будет) командой
ssh root@192.168.1.111 sudo shutdown -h now
ssh root@192.168.1.111 sudo reboot
Как это завернуть в dsf файл, пока не знаю :(
У меня получается выключить так:
1. ssh root@192.168.1.ххх
2. Подтверждение пароля root
3. sudo poweroff (shutdown -h now наверное то-же сработает)
Вопрос в том, как это сделать "в одно касание"?
Я же выше написал уже. Очевидно, что надо сделать аворизацию без пароля, либо пароль сразу в командной строке передавать. Затем там же в командной строке указать команду на выполнение в одиночных кавычках.
Конечная цель у меня, сделать для этой штуки http://dune-hd.com/rus/products/full_hd_media_players/16
dsf файл, при запуске которого выключался комп в локальной сети
А если нужно сервер Linux (Lubuntu) выключить с другой машины Linux? Скрипт не поможете?
Так там примерно то же самое. Легко ищется в яндексе по запросу: "выполнить команду по ssh".
Например вот так можно перезагрузить: ssh root@192.168.1.1 'reboot'
вернее здесь хотел спросить rdp.exe /v:10.10.5.14 /u:shut-user /p:pass123 /w:640 /h:480
Вопрос в чем? Это команда на подключение к удаленному серверу по rdp без запроса логина и пароля. В автозагрузке пользователя, под которым ты подключаешься, должен стоять скрипт на выключение компьютера.
а где здесь строчка о запуске батника который лежит в автозагрузке?
putty.exe -m shutdown.txt -ssh -P 22 -l root -pw rootpass 10.10.5.15
Не понял вопроса. Это код для завершения работы удаленной машины. При чем тут автозапуск?