当前位置: 首页 > news >正文

Qt实现远程开关机

实现远程控制电脑开关机

1、远程开机

了解一下远程控制开机的原理

在局域网内实现远程开机的原理主要依赖于Wake-on-LAN (WOL) 技术,Wake-on-LAN 是一种网络标准,用于通过网络唤醒计算机。需要确保目标计算机的 BIOS 和网络适配器支持 WoL,并在系统设置中启用该功能。
确保要远程控制的计算机处于同一局域网内,并且其 IP 地址是已知的
了解目标计算机的 MAC 地址,因为发送 WoL 数据包时需要使用它,每台计算机的网卡都有一个唯一的 MAC 地址,用于识别。
在同一局域网内部进行测试,外部网络可能需要路由器配置。

以下案例在局域网内开机已实现控制

#if 1 //两种方法均可实现 任选其一即可
void MainWindow::wakeOnLAN(QString strMac)
{QUdpSocket udpSocket;/*将字符串MAC转换成十六进制 存入数组*/char cstrMacAddr[6];/*构建一个魔术唤醒包  6字节0xFF 和  16次的 Mac地址*/QByteArray magicPacket;bool isOK;for(int j = 0;j < 6; j++){if(j < 5){cstrMacAddr[j] = strMac.mid(strMac.indexOf("-",j*3) - 2,2).toInt(&isOK,16);if(false == isOK)return ;}else if(j == 5){cstrMacAddr[j] = strMac.mid(strMac.indexOf("-",j*3 - 1) + 1,2).toInt(&isOK,16);if(false == isOK)return ;}}/*6个 0xFF*/for(int i = 0;i < 6; i++){magicPacket[i] = 0xFF;}/*16个 MAC*/for(int k = 0; k < 16; k++){for(int l = 0; l < 6; l++)magicPacket[(k+1)*6 + l] = cstrMacAddr[l];}udpSocket.writeDatagram(magicPacket, 102, QHostAddress("255.255.255.255"), 7);
}
#else
void MainWindow::wakeOnLAN(QString strMac)
{QByteArray qByte = strMac.toLocal8Bit().toStdString().c_str();char chMacAddr[9];char chMagicPacket[104];const char *lpMacAddr = qByte.data();sscanf_s(lpMacAddr, "%2x-%2x-%2x-%2x-%2x-%2x",&chMacAddr[0], &chMacAddr[1], &chMacAddr[2],&chMacAddr[3], &chMacAddr[4], &chMacAddr[5]);memset(chMagicPacket, 0xff, 6);int packetsize = 6;for (int i = 0; i < 16; i++){memcpy(chMagicPacket + packetsize, chMacAddr, 6);packetsize += 6;}QUdpSocket udpSocket;/*** 端口 9:通常用于 Wake-on-LAN(WoL)功能。这个端口是一个标准的广播端口,许多设备和网络适配器都监听这个端口以接收唤醒信号,    * 使用端口 9 时,目标设备会在收到 WoL 数据包时执行唤醒操作。* 端口 7: 通常用于 Echo Protocol,主要用于测试和诊断目的,允许发送数据并返回相同的数据。它不是专门用于远程开机的* 使用其他端口(如 7)可能不会导致预期的唤醒效果,因为这些端口没有专门设计用于 WoL*/udpSocket.writeDatagram(chMagicPacket, 102, QHostAddress("255.255.255.255"), 7);
}
#endif

2、远程关机

原理及实现步骤

网络连接
远程关机需要通过网络与目标计算机建立连接。常用的协议包括:
			SSH(Secure Shell):用于安全地访问远程计算机,执行命令。Windows 的 WMI(Windows Management Instrumentation):可以通过网络管理 Windows 系统。NetBIOS:在 Windows 网络中使用。
身份验证
			在执行关机命令之前,必须对目标计算机进行身份验证。常见的身份验证方法包括:用户名和密码:输入正确的凭据以获取权限。SSH 密钥:使用公钥和私钥进行无密码登录。
执行关机命令
			一旦成功连接并验证身份,客户端将发送一个关机命令到目标计算机。在 Linux 中,通常使用 shutdown 命令。在 Windows 中,可以使用 shutdown /s /t 0 命令。
权限要求
			进行远程关机的用户需要具有足够的权限。在 Windows 系统中,只有管理员用户或具有特定权限的用户才能关机。
网络安全
			在实施远程关机时,必须考虑网络安全问题,包括:使用加密协议(如 SSH)来保护数据传输。防止未授权访问(通过防火墙设置)。确保目标计算机的安全配置。
实现代码
#include <QCoreApplication>
#include <QProcess>
#include <QString>
#include <iostream>void shutdownRemoteComputer(const QString &ip, const QString &username, const QString &password) {// 构建 SSH 命令QString command = QString("sshpass -p %1 ssh %2@%3 'shutdown now'").arg(password, username, ip);// 执行命令QProcess process;process.start(command);process.waitForFinished();// 获取输出QString output = process.readAllStandardOutput();QString error = process.readAllStandardError();std::cout << "Output: " << output.toStdString() << std::endl;std::cout << "Error: " << error.toStdString() << std::endl;
}int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QString ip = "xxx.xxx.xxx.xxx"; // 替换为目标 IP 地址QString username = "xxx_username"; // 替换为目标用户名QString password = "xxx_password"; // 替换为目标用户密码shutdownRemoteComputer(ip, username, password);return a.exec();
}

注意

sshpass:这个示例中使用了 sshpass 来处理密码输入。在某些系统上,你可能需要安装 sshpass 工具。

在 Ubuntu 上可以通过以下命令安装。

sudo apt-get install sshpass
安全性

使用明文密码并不安全,建议使用 SSH 密钥认证,而不是直接在代码中写入密码。

错误处理

此示例没有进行详细的错误处理,实际应用中应根据需要添加适当的错误处理机制。

系统兼容性

上述示例的命令和工具可能在不同的操作系统上有所不同,请根据您的实际情况进行调整。

配置对方电脑

开机进入BIOS
1.Power Management setup ->WakeUpOnLAN 设置为Enable
2.WakeUp By PCI Card 设置为Enable
F10 保存退出 重启之后再关机会发现关机之后网卡灯依然闪烁。确保防火墙设置不会阻止UDP数据包。确保局域网内的路由和防火墙配置允许 WoL 和远程控制的流量。确保目标计算机上有合适的服务(如 SSH 服务器)运行。你需要有足够权限(如管理员或超级用户)在目标计算机上执行关机命令。

实现方法还有很多很多…

欢迎大家补充说明!

相关文章:

  • Flink Lookup Join的工作原理、性能优化和应用场景
  • systemd使用入门
  • 数据结构——顺序表(基础代码题)
  • golang 如何生成唯一的 UUID
  • 一个OpenHarmony rk3568编译问题
  • 品牌增长新引擎:TikTok达人内容营销策略解析
  • 6--苍穹外卖-SpringBoot项目中菜品管理 详解(二)
  • spring boot 项目中redis的使用,key=value值 如何用命令行来查询并设置值。
  • Python编码系列—Python访问者模式:为对象结构添加新功能的艺术
  • 如何快速免费搭建自己的Docker私有镜像源来解决Docker无法拉取镜像的问题(搭建私有镜像源解决群晖Docker获取注册表失败的问题)
  • vue3 商城系统中的 sku 功能的实现
  • 优秀在线 notion 头像制作工具分享-Notion Avatar Maker
  • 35 | 实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”
  • Chromium 设置页面打开系统代理源码分析c++
  • C语言 | Leetcode C语言题解之第443题压缩字符串
  • [deviceone开发]-do_Webview的基本示例
  • java2019面试题北京
  • JS题目及答案整理
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python3爬取英雄联盟英雄皮肤大图
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Shell编程
  • webpack入门学习手记(二)
  • 百度地图API标注+时间轴组件
  • 给github项目添加CI badge
  • 如何实现 font-size 的响应式
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 写代码的正确姿势
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 自定义函数
  • FaaS 的简单实践
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #100天计划# 2013年9月29日
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • (C++)八皇后问题
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Java数据结构)ArrayList
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (原)本想说脏话,奈何已放下
  • (原创)可支持最大高度的NestedScrollView
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .Net6使用WebSocket与前端进行通信
  • .net开发时的诡异问题,button的onclick事件无效
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • []常用AT命令解释()
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [ACP云计算]组件介绍
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试