使用 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 服务的方法
- 创建一个名为(类似于)的文件
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
win 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
- 运行以下命令将文件移动到正确的位置并启动 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 和您的服务的日志/事件。