Вы можете использовать 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
- Создайте файл с именем (что-то вроде)
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
- Затем создайте цель 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
- Выполните следующие команды, чтобы переместить файлы в правильные места и запустить службу 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 и вашего сервиса.