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";
}