Удаленное выключение и включение компьютера через HomeBridge, а так-же через HomeAssistant

26 ноября 2018, 12:35

После того, как вникаешь в тему автоматизации умных домов, становиться интересно "Чем же еще можно управлять?". После этого вопроса, в голове формируется целый список устройств, которые есть у вас дома и конечно всем этим хочется управлять. В этой статье я расскажу, как вам автоматизировать удаленное выключение и включение вашего компьютера с помощью HomeBridge или HomeAssistant.

У не которых возникает вопрос, "а зачем мне это нужно?". На этот вопрос каждый найдет свой ответ…. Кому-то может лень с места вставать, а кому-то как мне, надо по сценарию выключать все устройства перед сном. Казалось бы, очень простая задача и в интернете можно найти много информации как это сделать, но поверьте мне, после долгих мучений на нескольких компьютерах, я выявил очень много нюансов и попытаюсь об этом подробно рассказать.

Займёмся предварительной подготовкой Raspberry

Установкой HomeBridge или HomeAssistant на малину, мы не будем заниматься. На сайте подобные статьи уже есть.

Поехали... Сначала установим утилиту Samba на Raspberry, чтобы можно было обращаться к ресурсам SMB и CIFS с ОС Windows, а также ОС MacOS для наших нужд. 

Обновим индексы репозиторий:

sudo rm -Rf /var/lib/apt/lists
sudo apt-get update -y
sudo apt-get upgrade -y

Затем устанавливаем Samba:

sudo apt-get install samba samba-common-bin -y

Ставим пакет "sshpass", для автоматического входа из командной строки по паролю. Для более любопытных, подробнее здесь

sudo apt install sshpass -y

На этом наша подготовка Rasppbery закончена.

Предварительно подготовим и компьютер, которым будем управлять.


Для компьютеров с ОС Windows

Для того, чтобы завершить работу компьютера с ОС Windows удаленно по команде, еще и используя непривилегированную учётную запись, надо провести специальную подготовку, о котором далее я расскажу:

Запустите командную строку от имени администратора, это можно сделать через меню правого клика по кнопке "Пуск" или как показано на скриншоте.

Важный момент ! Включенный UAC (User Account Control) блокирует удаленный доступ по WMI на компьютере. По этому отключаем эту ни кому не нужную защиту.

Далее, для удобства, все действия будут выполняться из командной строке Windows. И так, поехали...

Для начала создаем новую учетную запись, например, "PowerControl", которую будем использовать для одной единственной задачи – удалённое выключение компьютера. Так же задаем ему какой-нибудь пароль, скажем 12345678 и для удобства скрываем его полностью из системы.

net user PowerControl 12345678 /add
net user PowerControl /expires:never
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v "PowerControl" /t REG_DWORD /d "0" /f
:::: Готово ::::

Чтобы удобно было копировать команды, соберу их сразу вместе с комментированием в консоли. Все что вам нужно сделать, это одним разом скопировать все и вставить в консоль командной строки Windows.

:::: Включаем службу Сервер (445 порт) и счетчики производительности сетевых служб.
sc config LanmanServer start= auto
LODCTR /E:PerfNet
:::: Разрешим протокол связи DCOM
reg add "HKLM\SOFTWARE\Microsoft\Ole" /v "EnableDCOM" /t REG_SZ /d "Y" /f
:::: Создадим ключ LocalAccountTokenFilterPolicy в реестре
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v "LocalAccountTokenFilterPolicy" /t REG_DWORD /d "1" /f
:::: Включаем службу для удаленного реестра Windows
sc config RemoteRegistry start= auto
sc start RemoteRegistry
:::: Разрешаем через брандмауэр Windows передавать данные WMI
:::: Вручную делается это так... Открываем "Панель уаправления" -> "Система и безопасность" -> "Брандмауэр Windows" -> "Разрешить запуск программы или компонента через брандмауэр Windows". Выбираем "Иструментарий управления Windows" (WMI) и жмем на кнопку Сохранить.
:::: но мы будем это делать из командной строки вот так:
netsh advfirewall firewall set rule group="Инструментарий управления Windows (WMI)" new enable=Yes
:::: Включим в оснастке брандмауэра исключения для "Удаленное управление Windows".
netsh advfirewall firewall set rule group="Удаленное управление Windows" new enable=Yes
:::: готово ::::
 

Теперь настроим политику безопасности для принудительного удаленного завершения работы.

Нажимаем на кнопку "Пуск",  в поиске вводим secpol.msc и жмем на клавишу Enter.

В левой колонке, открывшегося окна видим раздел под названием "Параметры безопасности", в нем открываем "Локальные политики" и переходим в раздел под названием "Назначение прав пользователей", находим и открываем пункт "Принудительное удаленное завершение работы". Здесь надо добавить учетную запись PowerControl. Нажимаем на кнопку "Добавить пользователя или группу... ", вводим PowerControl, жмем OK и еще раз OK.

Теперь надо написать команду, при послании которого, будет завершена работа удаленного компьютера в локальной сети:

Чтобы проверить правильность команды, в командной строке Rasppbery, вводим :

sudo net rpc shutdown -f -t 5 -C 'Message' -U user%password -I XXX.XXX.XXX.XXX

Значения ключей запуска команды shutdown:

  • -f - принудительно завершает работу системы;
  • -r - если заменить ключ -f на -r, то  вместо завершения работы произойдет перезагрузка;
  • -t 5 - время в секундах, после которого операционная система выполнит команду по ключу -f, либо -r;
  • -C "Message" - текст сообщения, который будет выведен на экран при выполнении команды по ключу -f, либо -r;
  • -U user%password - логин и пароль пользователя. Из примера, это будет "PowerControl%12345678";
  • -I XXX.XXX.XXX.XXX - IP-адрес выключаемого компьютера;
  • -p 445 - порта, прослушиваемый SMB, либо CIFS подсистемой (необязательный параметр, без него вначале прослушивается 445 порт, а после 139).
  • еще больше команд можно посмотреть здесь

Возможные уведомления от сервера:

При успешном подключении к удалённой системе и выполнении команды, увидим следующее уведомление:

shutdown of remote machine succeeded

А если у пользователя нет достаточных прав для выполнения команды, появиться следующее уведомление:

Could not initialise pipe winreg. 

Error was NT_STATUS_OBJECT_NAME_NOT_FOUND

ну а в случае, если система не принимает подключений, то вылезет такое:

Could not connect to server xxx.xxx.xxx.xxx...

На этом настройка для удалённого выключения компьютера под ОС Windows завершена, но мы еще не настроили удаленное включение... Так что перезагружаемся и продолжаем дальше.

В конце статьи Вы поймете почему этот текст зачеркнут!


Для компьютеров с ОС Linux, в том числе Raspbian

Ну что-же, как и в случае с Windows, также и в ОС Linux заведем специальную учетную запись пользователя для удаленного отключения или перезагрузки вашего ПК.

Все ниже указанные команды в основном требуют root-доступ, поэтому лучше запускать команды из-под учетной записи root или через sudo.

Наберем команду и получим права суперпользователя для выполнения команд (Необходимо будет вводить свой пароль)

sudo -i

Приступим к созданию нового пользователя под названием "PowerControl":

sudo useradd PowerControl

Задаем пользователю пароль, а то не сможем авторизоваться по ssh:

sudo passwd PowerControl

После ввода вышеуказанной команды, появиться запрос для ввода нового пароля "Enter new UNIX password:". Вводим пароль, скажем "12345678", после чего еще раз подтверждаем паролем на запрос "Retype new UNIX password:" и если все правильно, то увидим следующее сообщение "passwd: password updated successfully".

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

#### Создаем домашний каталог:
sudo mkdir /home/PowerControl
#### Перемещаем папку пользователя в скрытый каталог ===
sudo mv /home/PowerControl /var/PowerControl
#### Присваиваем папку пользователя к учетной записи ===
sudo usermod PowerControl -d /var/PowerControl
#### Делаем владельцем каталога пользователя "PowerControl"
sudo chown PowerControl /var/PowerControl
#### Меняем права доступа каталога:
sudo chmod 500 /var/PowerControl
#### готово ####

Теперь, взглянем на скриншот...  Тоже глаза мозолит?

Предлагаю скрыть учетную запись PowerControl с экрана приветствия. Сразу скажу, что, все действия проверялись на Ubuntu.

В Raspbian без GUI я думаю, сами понимаете, что смысла нету в этом....

Для скрытия пользователя, введем команду и создадим файл с именем пользователя PowerControl

sudo nano /var/lib/AccountsService/users/PowerControl

В открывшемся файле, вводим ниже уазанный текст

[User]
SystemAccount=true

После чего, жмем сначала на комбинацию клавиш CTRL+O, а потом CTRL+X чтобы сохранить изменения.

Отлично! Теперь ограничим доступ учетной записи "PowerControl", разрешим ему управлять только командой shutdown, при этом без ввода пароля. Для этого надо будет отредактировать файл sudoers.

Внимание! Любая ошибка в sudoers, выведет из строя сам sudo. Редактирование этого файла, делается только с помощью команды "visudo" и ничем другим! 

Хватит слов! Перейдем к делу, открываем sudoers следующей командой:

sudo visudo

Добавляем следующую строку:

PowerControl    ALL=(ALL) NOPASSWD: /sbin/shutdown

после записи

root    ALL=(ALL:ALL) ALL

Пример приведенный на скриншоте, сделан в ОС Raspbian. Возможно в других линуксоидах, это может маленько выглядеть по другому.

Теперь настроим команду по управлению питанием удаленного компьютера в локальной сети. Чтобы завершить работу системы или же перезагрузить, воспользуемся командой shutdown.

Чтобы проверить правильность команды, вводим его в командную строку Rasppbery:

sudo sshpass -p 'password' ssh -oStrictHostKeyChecking=no user@XXX.XXX.XXX.XXX sudo shutdown -r now

Значения ключей запуска команды shutdown:

  • password - пароль пользователя. Из примера, это будет "12345678";
  • user%XXX.XXX.XXX.XXX - логин и IP-адрес выключаемого компьютера. Из примера, логин будет "PowerControl";
  • -h - Остановить и завершить работу системы;
  • -H - Просто остановить систему;
  • -P - Отключить питание системы;
  • -r - если заменить ключ -h на -r, то  вместо остановки и завершения работы произойдет перезагрузка;

Оставлю список команд которое вернет назад все ваши проделанные действия!

sudo userdel PowerControl
sudo rm -rf /var/PowerControl
sudo rm -rf /home/PowerControl
sudo rm -rf /var/lib/AccountsService/users/PowerControl
sudo groupdel PowerManager

Для компьютеров с ОС MacOS

Вот и по тихой руки дошли и до MacOS. Логика та же, заводим специальную учетную запись пользователя для удаленного отключения или перезагрузки вашего ПК, как и в случае с Windows и ОС Linux.

Так же как и в ОС Linux, все ниже указанные команды надо запускать из-под учетной записи root или через sudo, так как команды в основном требуют root-доступ. 

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

sudo -i

Создаем нового пользователя под названием "PowerControl" и задаем пароль, скажем "12345678" :

sudo sysadminctl -addUser PowerControl -password 12345678

Здесь опять же, для вашего удобства, все действия минимизированы. Скопируйте команды и вставьте в терминал.

#   === Перемещаем папку пользователя в скрытый каталог ===
sudo mv /Users/PowerControl /var/PowerControl
#   === Присваиваем папку пользователя к учетной записи ===
sudo dscl . create /Users/PowerControl NFSHomeDirectory /var/PowerControl
sudo dscl . delete "/SharePoints/PowerControl's Public Folder"
#          == Делаем владельцем и меняем права каталога ===
sudo chown PowerControl:PowerManager /var/PowerControl
sudo chmod 500 /var/PowerControl
#   === Скрываем учетную запись и поле входа "Other..." ===
sudo defaults write /Library/Preferences/com.apple.loginwindow HiddenUsersList -array-add PowerControl
sudo defaults write /Library/Preferences/com.apple.loginwindow SHOWOTHERUSERS_MANAGED -bool false
#               === Включение удаленного входа по SSH
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
#               === Удаляем ранее созданию группу для ограничения доступа
dseditgroup -o delete -t group com.apple.access_ssh
#               === Создадим группу для ограничения доступа
sudo dseditgroup -o create -q com.apple.access_ssh
#               === Разрешим удаленный доступ пользователю
sudo dseditgroup -o edit -t user -a PowerControl com.apple.access_ssh
# готово #

Давайте теперь ограничим учетную запись "PowerControl" и разрешим ему управлять только командой shutdown без ввода пароля. Для этого, как и в ОС Linux отредактируем файл sudoers.

Внимание! Еще раз предупрежу! Любая ошибка в sudoers, выведет из строя сам sudo. Редактирование этого файла, делается только с помощью команды "visudo" и ничем другим! 

Сразу скажу что в macOS редактор не такой как в ОС Linux, поэтому прошу делать ровно ,так, как расписано ниже.

Клавиатура должна быть переключена на английскую раскладку.. 

Если раньше уже редактировался sudoers, то при попытке открыть его может выйти предупреждение как на скриншоте. Беспокоиться не надо, просто нажимаем на клавишу "E".

Итак, открываем sudoers следующей командой:

sudo visudo

Клавишей "Вверх/Вниз" находим раздел со строкой

# root and users in group wheel can run anything on any machine as any user

и нажимаем на клавишу "i", после чего должна появиться снизу надпись "--INSERT--".

Ниже находим

%admin          ALL = (ALL) ALL

и после него добавляем

PowerControl    ALL=(ALL) NOPASSWD: /sbin/shutdown

Нажимаем на клавишу "ESC", должна пропасть надпись "--INSERT--" и набираем :wq

Команду :wq НЕНАДО КОПИРОВАТЬ!!! Его надо вручную вводить после чего нажать на клавишу "Enter"

На этом подготовительная настройка macOS завершена, но я знаю что у вас остался один вопрос, насчет команды по которой и будет управляться питание удаленного компьютера в локальной сети. Команда та-же, что и в ОС Linux, именно поэтому я все время его и упоминал...

sudo sshpass -p 'password' ssh -oStrictHostKeyChecking=no user@XXX.XXX.XXX.XXX sudo shutdown -r now

Оставлю список команд которое вернет назад все ваши проделанные действия!

#               === Возвращаем скрытые учетные записи ===         #
sudo defaults delete /Library/Preferences/com.apple.loginwindow HiddenUsersList
#               === Удаляем пользователя и группу ===              #
sudo sysadminctl -deleteUser PowerControl
sudo dseditgroup -o delete PowerManager
#               === Выключение удаленного входа (SSH) ===          #
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
#               === Очищаем и Удаляем dseditgroup ===              #
sudo dseditgroup -o edit -t user -d PowerControl com.apple.access_ssh
sudo dseditgroup -o edit -d PowerManager -t group com.apple.access_ssh
sudo dseditgroup -o delete -t group com.apple.access_ssh
exit
# готово #

Перейдем к настройкам HomeBridge и HomeAssistant

Ниже я расскажу как настроить и HomeBridge и HomeAssistant, а чем именно пользоваться, этот выбор уже за вами...

Для HomeBridge, установим плагин homebridge-wol. Далее в  конфигурациях находим разделе "accessories" и дописываем это

   {
            "accessory": "NetworkDevice",
            "name": "Имя вашего компьютера",
            "mac": "MAC-адрес вашего компьютера",
            "ip": "IP-адрес вашего компьютера",
            "shutdownCommand": "Команда для выключения вашего компьютера"
        },

Для HomeAssistant, открываем файл настроек configuration.yaml и в конце дописываем это :

switch:
  - platform: wake_on_lan
    name: Имя вашего компьютера
    mac_address: MAC-адрес вашего компьютера
    host: IP-адрес вашего компьютера
    turn_off:
      service: shell_command.turn_off_mypc

shell_command:
  turn_off_mypc: "Команда для выключения вашего компьютера"

Слишком много времени требуется для изучения возможных настроек на разных операционных системах и железок, а еще больше чтобы написать статью. Пока что время не позволяет, но совсем скоро я дополню эту статью и распишу способы удаленного включения вашего компьютера на разных операционных системах. Если вам понравилась статья, то поддержите хотя бы лайком. Это дает стимул, для творчества...



Все новости мира умных домов - t.me/SprutAI_News

Остались вопросы? Мы в Telegram - t.me/soprut

  1. Евгений Лузин (EvLuz)
    Евгений Лузин (EvLuz) 7 месяцев назад

    Спасибо за статью, хочется Маком поуправлять, но знаю что сложно. Ждем продолжения

  2. Тимофей Передерий (Timon)
    Тимофей Передерий (Timon) 7 месяцев назад

    Спасибо! Жду продолжения! Давно над подобной задачей бьюсь!!! Очень актуально))) Буду тестит на своих серверах, дам фидбэк!

    • Карен  Закарян (Karen)
      Карен Закарян (Karen) 7 месяцев назад

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

  3. (BeSLaN)
    (BeSLaN) 6 месяцев назад

    sudo groupadd PowerManager

    sudo usermod -G powermanager PowerControl

    Вторую команду выполнить не получалось, пока не прописал powermanager как в строке создания группы - PowerManager и со строчкой crown тоже самое

    Но все равно в итоге ничего не получается в Putty - ssh: connect to host 192.168.2.111 port 22: Connection timed out

    • Карен  Закарян (Karen)
      Карен Закарян (Karen) 2 месяца назад

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

  4. (Dn333)
    (Dn333) 5 месяцев назад

    Что то у меня не очень получилось.

    вот что выдает homebridge при попытке выключить компьютер

    [1/31/2019, 2:04:30 PM] [PC Win10] NetworkDevice "PC Win10" (10.0.1.100) went from status "Shutting Down" to "Online" 

    [1/31/2019, 2:04:38 PM] [PC Win10] NetworkDevice shutdown cycle started for "PC Win10" (10.0.1.100) 

    [1/31/2019, 2:04:38 PM] [PC Win10] Attempting to shut down "PC Win10" (10.0.1.100) using "sudo net rpc shutdown -f -t 5 -C 'Message' -U PowerControl%12345678 -I 10.0.1.100" [1/31/2019, 2:04:38 PM] [PC Win10] NetworkDevice "PC Win10" (10.0.1.100) went from status "Online" to "Shutting Down" 

    [1/31/2019, 2:04:38 PM] [PC Win10] An error occured while trying to shut down "PC Win10" (10.0.1.100): Error: Command failed: sudo net rpc shutdown -f -t 5 -C 'Message' -U PowerControl%12345678 -I 10.0.1.100 /bin/sh: sudo: not found

    HomeBridge установлено на NAS Synology ( DSM 6.2.1-23824 Update 2 ).

    Может кто-нибудь помочь?

К списку статей

Скидки для сообщества

Интернет-магазин yourhomekit.ru

+7 914 550-51-11
Промокод:
SPRUT-BLG
Размер скидки:
8%
Cамый большой ассортимент в России аксессуаров Apple HomeKit

Похожие статьи

15 ноября 2018, 13:11
Xiaomi Mi Remote 360 добавляем Apple HomeKit
04 сентября 2018, 12:14
Интеграция RGB ленты на ESP8266 с прошивкой tasmota в систему HomeBridge (HomeKit)
09 ноября 2018, 20:54
Кейс создания умного дома без каких либо прокладок в виде Raspberry pi
15 октября 2018, 09:05
Прошивка для Sonoff c нативным HomeKit
15 ноября 2018, 09:42
Способы автоматизации механических ворот
27 октября 2018, 12:20
Нативный Термостат для котла на ESP8266 с поддержкой Apple HomeKit
01 октября 2018, 07:43
Нативный HomeKit на ESP8266
15 июня 2018, 12:13
Охранная система в гараж на ESP8266 с интеграцией в Apple HomeKit
24 августа 2018, 12:18
Пошаговая установка HomeAssistant
27 августа 2018, 10:14
Интегрируем ХА в HomeKit