Используя CentOS 7, я хочу выключить компьютер с Windows, прежде чем сервер Linux выключится.

Я возился с net rpc / samba, но не могу заставить его работать.

Большинство вопросов, которые я нашел, как мой, наоборот (с помощью машины Windows, чтобы выключить машину Linux

1 ответ1

0

Вы можете использовать net rpc для этого - синтаксис:

net rpc SHUTDOWN -f -I <IP Address of Windows PC> -U <windows-username>

Если вы хотите написать этот сценарий, вам нужно сохранить учетные данные Windows на компьютере с Linux - это может варьироваться от сохранения в виде простого текста до аутентификации Kerberos.

Вот очень похожий вопрос с некоторыми дополнительными сведениями о полномочиях:https://serverfault.com/questions/539699/shutting-down-a-windows-workstation-remotely-from-linux

Обновить

Вы можете создать простой сервис systemd, который будет запускаться во время события отключения (выключения или перезагрузки). Существует два основных подхода к запуску службы systemd при запуске / перезагрузке

  • Активизировать службу (ваш сервис), чтобы отключить ее. Это указывает на то, что система, вероятно, выходит из строя, НО это также может означать, что сама служба была только что остановлена; например, пользователем. Этот подход используется ниже.

  • Запуск по перезагрузке, выключению и kexec цели / события. Я нашел это менее надежным и избегать их. В вашей системе centos 7 у вас, вероятно, установлена служба (вероятно, не включена), например, - /usr/lib/systemd/system/canberra-system-shutdown-reboot.service

Вот как создать сервис systemd

  1. Создайте файл с именем (что-то вроде) winpcshutdown.service . Это должно заканчиваться суффиксом .service , с этим содержимым

файл: winpcshutdown.service

[Unit]
Description=Issue Poweroff Command to Win PC

[Service]
ExecStop=/usr/local/sbin/shutdownScript.sh
Type=oneshot
RemainAfterExit=yes

[Install]   
WantedBy=multi-user.target
  1. Затем создайте цель ExecStop; shutdownScript.sh , который мы перейдем по этому пути. Этот скрипт выдаст команду net на ПК-победитель. Мы также проверим, чтобы убедиться, что мы не получили команду «Стоп», потому что нас умышленно остановили по причинам, не связанным с переключением питания. РЕДАКТИРОВАТЬ: я изменил критерии здесь, поскольку это было противоречивым; systemctl is-system-running вернет false, если состояние системы находится в переходном состоянии, как при отключении питания, так и (при этом не имеет значения) при включении питания.

файл: shutdownScript.sh

#!/bin/bash
# Check if the service is still enabled; if so then the stop order is legit.
if ! /usr/bin/systemctl -q is-system-running ; then
    /usr/bin/net rpc SHUTDOWN -f -I <IP Address of Windows PC> -U <windows-username>
else
  #Do Nothing
fi
  1. Выполните следующие команды, чтобы переместить файлы в правильные места и запустить службу systemd.

chmod 755 shutdownScript.sh
sudo cp shutdownScript.sh /usr/local/sbin/
chmod 644 winpcshutdown.service
sudo cp winpcshutdown.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable winpcshutdown.service
sudo systemctl start winpcshutdown.service

Наконец, убедитесь, что служба активна, запросив ее с помощью этой команды: systemctl status winpcshutdown.service

Распространенные системные ошибки -

  • Забыть набор разрешений на выполнение скрипта, вызываемого сервисом
    • Забыв о Шебанге #!/bin/bash в скрипте; systemd не выполнит его без определения в самом вызове (скрипт /usr /bin /bash) или в заголовке.
  • Не включая полные пути для каждой команды - среда systemd редкая, и вы не можете предполагать, что исполняемый файл находится на ее пути.

Команду journalctl можно использовать для просмотра журналов / событий с помощью systemd и вашего сервиса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .