在 CentOS 7 关机前关闭 Windows PC

在 CentOS 7 关机前关闭 Windows PC

使用 CentOS 7,我想在 Linux 服务器关闭之前关闭 Windows 机器。

我一直在摆弄 net rpc/samba,但却无法让它工作。

我发现大多数问题都是相反的(使用 Windows 机器关闭 Linux 机器

答案1

您可以使用 net rpc 来执行此操作 - 语法是:

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

如果您希望编写脚本,则需要在 Linux 机器上保存 Windows 凭据 - 范围可以从以纯文本保存到 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,我们将移动到该路径。此脚本将向netwin PC 发出命令。我们还将检查以确保我们没有收到“停止”命令,因为我们是因与电源循环无关的原因而故意停止的。编辑:我在这里更改了标准,因为它不一致;如果系统状态处于转换状态,无论是断电还是(此处无关)通电,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

常见的 systemd 错误 -

  • 忘记设置服务调用的脚本的执行权限
    • #!/bin/bash忘记脚本中的shebang ;如果没有在调用本身( /usr/bin/bash 脚本 )或标头中定义它,systemd 将不会执行它。
  • 不包括每个命令的完整路径 - systemd 环境很稀疏,您不能假设可执行文件在其路径上。

命令 journalctl 可用于查看 systemd 和您的服务的日志/事件。

相关内容