QT学习笔记-QT程序执行Linux Shell命令实现动态添加路由

news2025/1/15 23:26:39

QT学习笔记-QT程序执行Linux Shell命令实现动态添加路由

  • 背景
  • 关键代码
  • 程序界面

背景

在使用QT进行Linux下应用程序开发时,在特定业务需求下,需要在程序中执行Linux的Shell命令。QT中执行Linux命令可以通过QProcess类和system来实现,如果需要得到Shell命令的执行的结果则只能通过QProcess类来实现。本示例解决的一个业务需求是带双网卡的Linux工控机中需要通过增加路由访问其他网段的服务器,最开始是把添加动态路由的功能写在启动脚本(shell脚本)中了,但在测试的时候拔掉对应的网线后,动态添加的路由会丢失,这时再插上网线还是不能与其他网段的服务器进行通讯。

关键代码

/**
 * @brief execShellCommand 执行Linux Shell 命令
 * @param cmd 要执行的命令
 * @param args 参数列表
 * @return 返回执行的结果
 */
QString Widget::execShellCommand(QString cmd, QStringList args)
{
    QProcess proc;
    proc.start(cmd, args, QIODevice::ReadWrite);
    proc.waitForFinished();
    QString result = proc.readAllStandardOutput();
    return result;
}
/**
 * @brief routeExists 判断系统路由表中是否存在对应的路由信息
 * @param fromNetPart 源网段,比如:10.10.80.0
 * @param toGateway   目标网关,比如:192.168.0.1
 * @param netmask     子网掩码,比如:255.255.255.0
 * @return
 */
bool Widget::routeExists(QString fromNetPart, QString toGateway, QString netmask)
{
    bool flag = false;      //是否存在对应的路由
    QString cmd = "route";
    QStringList args = QString("-n").split(" ");
    QString routeTable = execShellCommand(cmd, args);
    QStringList routeList = routeTable.split("\n");

    for(QString routeItem : routeList)
    {
//        qDebug() << routeItem;
        if (routeItem.contains(fromNetPart) && routeItem.contains(toGateway) && routeItem.contains(netmask))
        {
            flag = true;
            break;
        }
    }
    return flag;
}
void Widget::on_pushButton_2_clicked()
{
    QString fromNetPart = "10.10.80.0";             //表示当前网段
    QString toGateway = "192.168.0.1";              //目标网关
    QString netmask = "255.255.255.0";              //子网掩码

    if (ui->txtFromNetPart->text() != "")
    {
        fromNetPart = ui->txtFromNetPart->text();
    }
    if (ui->txtNetmask->text() != "")
    {
        netmask = ui->txtNetmask->text();
    }
    if (ui->txtToGateway->text() != "")
    {
        toGateway = ui->txtToGateway->text();
    }

    qDebug() << "execute Route command ... begin";
    qDebug() << "---------------------------------------";
    bool flag = routeExists(fromNetPart, toGateway, netmask);
    if (!flag)
    {
        // 定义添加路由的命令
        QString strCommand = QString("route add -net %1 netmask %2 gw %3").arg(fromNetPart, netmask, toGateway);
        qDebug() << strCommand;
        system(strCommand.toStdString().data());
    }
    qDebug() << "---------------------------------------";
    qDebug() << "execute Route command ... end";
}

程序界面

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1108194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Service 把前端连接到后端

使用 Service 把前端连接到后端 如何创建前端&#xff08;Frontend&#xff09;微服务和后端&#xff08;Backend&#xff09;微服务。后端微服务是一个 hello 欢迎程序。 前端通过 nginx 和一个 Kubernetes 服务暴露后端所提供的服务。 使用部署对象&#xff08;Deployment ob…

Android Gradle权威指南读书笔记

第一章 Gradle入门 生成Gradle Wrapper 命令&#xff1a;gradle wrapper --gradle-version 版本号自定义Gradle Wrapper task wrapper(type : Wrapper) { gradleVersion 2.4 archiveBase GRADLE USER HOME archivePath wrapper/dists distributionBase GRADLE USER HOME …

基于PHP的宠物爱好者交流平台管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

windows下8.0版本mysql创建用户并授权

简单记录下&#xff0c;可能有些杂乱 root用户登录mysql 创建用户 create user 要创建的用户名允许连接的ip identified by 用户名对应的密码; flush privileges; //刷新权限举个例子&#xff1a; create user test1localhost identified by test1; flush privileges; …

docker 基本用法-操作镜像

1.下载镜像 docker search centos #默认从 Docker Hub 中搜索镜像 访问 dockerhub&#xff1a;https://registry.hub.docker.com docker pull centos 拉取镜像 如果不能拉取 方法 1.需要配置配置镜像加速器 tee /etc/docker/daemon.json << EOF {"registry-mirro…

卡尔曼滤波器公式

1、卡尔曼滤波公式如下 &#xff08;1&#xff09;预测方程&#xff1a; 预测状态向量转换矩阵*上一时刻更新的状态向量 控制矩阵*当前的系统输入 /----------------------P推导 begin-----------------------------/ 预测系统状态的协方差矩阵 E[(状态向量-预测状态向量&am…

红帽认证笔记2

文章目录 1.配置系统以使用默认存储库1.调试selinux2.创建用户账户3.配置cron4. 创建写作目录5. 配置NTP6.配置autofs配置文件权限容器解法1.修改journal配置文件2.重启服务3.拷贝文件到指定目录4.修改拥有人所属组5.修改umask6.切换elovodo用户7.登录容器仓库8.拉取镜像9.运行…

《视觉 SLAM 十四讲》V2 第 9 讲 后端优化1 【扩展卡尔曼滤波器 EKF BA+非线性优化(Ceres、g2o)】

文章目录 第9讲 后端19.1.2 线性系统和 KF9.1.4 扩展卡尔曼滤波器 EKF 不足 9.2 BA 与 图优化9.2.1 投影模型和 BA 代价函数9.2.2 BA 的求解9.2.3 稀疏性 和 边缘化9.2.4 鲁棒核函数 9.3 实践&#xff1a; Ceres BA 【Code】本讲 CMakeLists.txt 9.4 实践&#xff1a;g2o 求解 …

FTP(数据共享)

1. 软件下载 到官方网站下载FileZilla的服务端和客户端程序 网站:FileZilla - The free FTP solution 自行下载即可 2. 服务器安装与配置 2.1 安装 安装的过程非常简单&#xff0c;直接下一步就可以了&#xff0c;需要说明的是&#xff0c;下图中的端口指的是FileZill…

GCC内联汇编及其在Linux内核中的使用

1. 概述 学习 GCC 内联汇编又多了一个好处。现在让我们深入内核&#xff0c;看看一些事情是如何实际工作的。 GNU C 编译器允许您将汇编语言代码嵌入到 C 程序中。 本教程解释了如何在 ARM 架构上做到这一点(译注&#xff1a;因此&#xff0c;若要测试本文档中使用的例子&…

Android MediaMetadataRetriever setDataSource failed: status = 0xFFFFFFEA

Android MediaMetadataRetriever setDataSource抛错&#xff1a; java.lang.RuntimeException: setDataSource failed: status 0xFFFFFFEA 原因是 setDataSource(String path) path指向的视频文件大小为0或者是破损视频资源。 Android AppGlideModule,DataFetcher,ModelLoad…

力扣刷题 day48:10-18

1.4的幂 给定一个整数&#xff0c;写一个函数来判断它是否是 4 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 4 的幂次方需满足&#xff1a;存在整数 x 使得 n 4x 方法一&#xff1a;不断除以4 #方法一&#xff1a;不断除…

windows本地文件上传linux 或 linux输入rz命令后出现receive.**B0100000023be50

这种现象需要客户端支持&#xff0c;或者使用Xshell工具等 但是有一种简单的方法&#xff0c;使用 sftp rootip地址 // 比如 sftp root127.0.0.2 当然&#xff0c;你要记得登录远程节点的密码&#xff1a;

什么是gpt?国内怎么用?

近年来&#xff0c;人工智能技术在国内迅猛发展&#xff0c;成为推动社会进步的重要力量。在这个数字化时代&#xff0c;智能助手在生活中的应用越来越广泛。其中&#xff0c;OpenAI的ChatGPT作为一种先进的自然语言处理模型&#xff0c;为用户提供了强大的智能对话体验。但是O…

什么是网络爬虫,爬虫的机制是那些

网络爬虫&#xff08;也称为网页蜘蛛、网络机器人或网页追逐者&#xff09;是一种按照预设规则&#xff0c;自动抓取万维网信息的程序或脚本。它们广泛应用于搜索引擎、数据挖掘、竞争情报、价格监测等各种互联网应用中。 爬虫机制是爬虫程序或机器人用来访问、抓取、索引以及…

智慧人防三维数字沙盘系统

1&#xff09;系统架构设计 智慧人防三维数字沙盘系统软件是深圳易图讯科技有限公司(www.3dgis.top)基于WebGL、WEBGIS平台引擎自主研发&#xff0c;以二三维地理空间场景为电子沙盘展示平台&#xff08;支持导入3DMAX、BIM、无人机倾斜等三维模型&#xff09;&#xff0c;以二…

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

上一课&#xff1a; 【小黑嵌入式系统第一课】嵌入式系统的概述&#xff08;一&#xff09;——概念、特点、发展、应用 下一课&#xff1a; 【小黑嵌入式系统第三课】嵌入式系统硬件平台&#xff08;一&#xff09;——概述、总线、存储设备&#xff08;RAM&ROM&FLASH…

好用的办公软件有哪些

日常的工作难免和各种各样的软件打交道&#xff0c;除了传统的Office三件套&#xff0c;小编日常还在用着其他的办公软件&#xff0c;借此跟各位分享其中比较好用、堪称办公神器的8款软件&#xff01; 1.WPS office 2.office2007 3.EasyConnect 4.ToDesk 5.Photoshop 6.A…

DAY 1 QT 创建QQ界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//创建一个窗口&#xff0c;改变窗口标签名和窗口标签图标this -> resize(640,500);//设置窗口界面大小this -> setWindowTitle("QQ登录");//设置窗口标题this -> s…

linux手动安装scapy2.5

手动安装scap2.5&#xff0c;或者其他版本 当然如果有网络的话&#xff0c;可以直接安装最新版本(如果本地python版本支持的话)&#xff1a; pip install scapy查看python版本与scapy版本支持关系&#xff1a; 下载安装包 scapy2.5地址&#xff1a;scapy2.5.0 scapy历史地址…