下面是一个使用Qt实现通过nmcli指令查询和修改系统的IP、DNS、网关、子网掩码的示例程序:
#include <QCoreApplication>
#include <QProcess>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 查询当前网络连接的名称
QString connectionName = "";
QProcess listConnectionProcess;
listConnectionProcess.start("nmcli connection show --active");
if (listConnectionProcess.waitForFinished() && listConnectionProcess.exitCode() == 0) {
QString output = listConnectionProcess.readAllStandardOutput();
QStringList lines = output.split('\n');
if (lines.size() > 1) {
QStringList connectionInfo = lines[1].split(QRegExp("\\s+"), Qt::SkipEmptyParts);
if (connectionInfo.size() > 0) {
connectionName = connectionInfo[0];
}
}
}
// 查询当前网络连接的详细信息
QString ipAddress = "";
QString dnsServers = "";
QString gateway = "";
QString subnetMask = "";
QProcess showConnectionProcess;
showConnectionProcess.start(QString("nmcli connection show %1").arg(connectionName));
if (showConnectionProcess.waitForFinished() && showConnectionProcess.exitCode() == 0) {
QString output = showConnectionProcess.readAllStandardOutput();
QStringList lines = output.split('\n');
foreach (const QString& line, lines) {
QStringList keyValue = line.split(QRegExp("\\s+"), Qt::SkipEmptyParts);
if (keyValue.size() >= 2) {
if (keyValue[0] == "IP4.ADDRESS[1]") {
ipAddress = keyValue[1].split("/")[0];
subnetMask = keyValue[1].split("/")[1];
} else if (keyValue[0] == "IP4.GATEWAY") {
gateway = keyValue[1];
} else if (keyValue[0] == "IP4.DNS[1]") {
dnsServers += keyValue[1] + ",";
}
}
}
}
// 打印当前网络连接的信息
qDebug() << "Connection Name: " << connectionName;
qDebug() << "IP Address: " << ipAddress;
qDebug() << "Subnet Mask: " << subnetMask;
qDebug() << "Gateway: " << gateway;
qDebug() << "DNS Servers: " << dnsServers;
// 修改网络连接的IP、DNS、网关和子网掩码
QString newIpAddress = ""; // 新的IP地址
QString newDnsServers = ""; // 新的DNS服务器(以逗号分隔)
QString newGateway = ""; // 新的网关
QString newSubnetMask = ""; // 新的子网掩码
QStringList modifyCommand;
// 设置要修改的属性及对应值,如果不需要修改某个属性,可以留空或注释掉相关代码
if (!newIpAddress.isEmpty()) {
modifyCommand.append("ipv4.addresses");
modifyCommand.append(QString("%1/%2").arg(newIpAddress).arg(newSubnetMask));
}
if (!newGateway.isEmpty()) {
modifyCommand.append("ipv4.gateway");
modifyCommand.append(newGateway);
}
if (!newDnsServers.isEmpty()) {
modifyCommand.append("ipv4.dns");
modifyCommand.append(newDnsServers);
}
if (!modifyCommand.isEmpty()) {
modifyCommand.prepend("nmcli", "connection", "modify", connectionName);
QProcess modifyConnectionProcess;
modifyConnectionProcess.start("sudo", modifyCommand); // 如果需要管理员权限,请确保程序以管理员权限运行
if (modifyConnectionProcess.waitForFinished() && modifyConnectionProcess.exitCode() == 0) {
qDebug() << "网络连接信息修改成功!";
} else {
qDebug() << "网络连接信息修改失败:" << modifyConnectionProcess.readAllStandardError();
}
}
return 0;
}
这个程序首先使用nmcli
命令查询当前活动的网络连接名称,然后使用该名称查询详细的连接信息,包括IP地址、子网掩码、网关和DNS服务器。接下来,你可以设置新的IP地址、子网掩码、网关和DNS服务器,并使用nmcli connection modify
命令将其应用到网络连接上。
请注意,为了执行这些命令,程序需要具有足够的权限(例如以管理员身份运行)。如果你在Linux上运行此程序时遇到问题,请确保已经正确安装了network-manager
工具。
内容由零声教学AI助手提供,问题来源于学员提问