懒人办法抓取Linux 桌面系统的相关信息

Windows 下有非常多的桌管系统,在办公网络中管理人员可以在平台上监管所有桌面的运行情况,但Linux 桌面用于办公也是国家近两年推广正版化才开始普及,配套的桌面管理系统并不多。我们提一个假设性的需求,如何在中心查看下面各个运行Linux 桌面的实际情况;如掌握CPU 、内存、显卡、打印机、网络MAC、IP 等等, 以及已经安装了哪些软件、正在运行哪些软件。 要想集中掌握这些情况,一般需要在客户机上运行一个客户端采集程序。由客户端的采集程序从本机抓取这些信息后发送给服务端。服务端分解数据再呈现于界面上。

因此首先我们必须能有一个本地程序是可以获取想要信息的,对sys/ 开放的接口不熟悉,本次仍尝试用调取命令行的方式取得返回消息。

在 deepin 15.1 上测试:


#include "pcinfo.h"
#include <QDebug>
#include <QSettings>
#include <QDBusInterface>
#include <QNetworkInterface>
#include <QDBusReply>



QString PCInfo::getLinuxInfo(){

   /**
    * 调用 uname -a 命令 获取内核版本信息
    ================================================================ */

    QProcess p;
    QString command = "";
    QStringList args;
    QString strTemp = "";
    //QStringList tmpList;

    QString linuxInfo = "";
    command = "uname";
    args.clear();
    args.append( "-a" );
    p.start( command,args );
    p.waitForFinished();
    strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
    linuxInfo = strTemp.trimmed();
    qDebug()<<"linuxInfo:"<< linuxInfo;

    return linuxInfo;

}

QString PCInfo::getDeepinInfo(){

    /**
     * 调用 lsb_release -a 命令 获取deepin 版本信息
     ================================================================ */

    QProcess p;
    QString command = "";
    QStringList args;
    QString strTemp = "";
    QStringList tmpList;

    QString deepinInfo = "";
    command = "lsb_release";
    args.clear();
    args.append( "-a" );
    p.start( command,args );
    p.waitForFinished();
    strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
    //deepinInfo = strTemp;
    tmpList.clear();
    tmpList = strTemp.split("\n");
    foreach( QString str,tmpList ){

       if ( str == "" || str.indexOf( "Description:" ) < 0 ){
           continue;
       }

       QStringList mm = str.split(" ");

       foreach( QString str,mm ){

          if ( str == "" || str.indexOf( "Description:" ) >= 0 ){
               continue;
          }
          qDebug()<<"Description:"<< str.trimmed();
          deepinInfo += str.trimmed()+" ";
          //break;
       }
    }

    deepinInfo = deepinInfo.trimmed();
    qDebug()<<"deepinInfo:"<< deepinInfo;

    return deepinInfo;
}

QString PCInfo::getPrintInfo(){

  /**
   * 调用 lpstat -v 命令 获取打印机信息
   ================================================================ */
   QProcess p;
   QString command = "";
   QStringList args;
   QString strTemp = "";
   //QStringList tmpList;

   QString printInfo = "";
   command = "lpstat";
   args.clear();
   args.append( "-v" );
   p.start( command,args );
   p.waitForFinished();
   strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
   printInfo = strTemp;
   qDebug()<<"printInfo:"<< printInfo;

   return printInfo;

}

QString PCInfo::getVGAinfo(){

    /**
     * 调用 lspci 命令 获取 pci 设备信息
     * 过滤出 VGA 显卡设备
     ================================================================ */
    QProcess p;
    QString command = "";
    QStringList args;
    QString strTemp = "";
    QStringList tmpList;

    QString PCIinfo = "";
    command = "lspci";
    args.clear();
    p.start( command,args );
    p.waitForFinished();
    strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
    tmpList.clear();
    tmpList = strTemp.split("\n");
    QString VGAinfo = "";
    foreach( QString str,tmpList ){
       if ( str == ""  ){
           continue;
       }
       if ( str.indexOf( "VGA" ) >=0 )
       {
           VGAinfo = str;
       }
    }
    qDebug()<<"VGAinfo:"<< VGAinfo;

    return VGAinfo;

}

QString PCInfo::getMeminfo(){

    /**
     * 调用 free -m 命令 内存使用情况
     ================================================================ */
    QProcess p;
    QString command = "";
    QStringList args;
    QString strTemp = "";
    QStringList tmpList;

    QString meminfo = "";
    command = "free";
    args.clear();
    args.append("-m");
    p.start( command,args );
    p.waitForFinished();
    strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
    tmpList.clear();
    tmpList = strTemp.split("\n");
    //QString memStrs = "";
    QString memCount = "";
    foreach( QString str,tmpList ){

       if ( str == "" || str.indexOf( "Mem:" ) < 0 ){
           continue;
       }

       QStringList mm = str.split(" ");
       foreach( QString str,mm ){
          if ( str == "" || str.indexOf( "Mem:" ) >= 0 ){
               continue;
          }

          memCount = str.trimmed();
          qDebug()<<"memCount:"<< memCount;
          meminfo = memCount;
          break;
       }
    }
    qDebug()<<"meminfo:"<< meminfo;

    return meminfo;

}

QString PCInfo::getCpuinfo(){

    /**
     * 调用 lscpu 命令 获取cpu 情况
     ================================================================ */
    QProcess p;
    QString command = "";
    QStringList args;
    QString strTemp = "";
    QStringList tmpList;

    QString cpuinfo = "";
    command = "lscpu";
    args.clear();
    p.start( command,args );
    p.waitForFinished();
    strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
    tmpList = strTemp.split("\n");
    foreach( QString str,tmpList ){
       if ( str.indexOf( "Model name:" ) >= 0 ){
          QStringList strX = str.split(":");
          cpuinfo = QString( strX[1] ).trimmed();
       }
       continue;
    }
    qDebug()<<"cpuinfo:"<< cpuinfo;

    return cpuinfo;
}

QString PCInfo::getHostname(){

    /**
     * 调用 hostname 命令 获取机器名
     ================================================================ */
    QProcess p;
    QString command = "";
    QStringList args;
    QString strTemp = "";
    //QStringList tmpList;

    QString hostname = "";
    command = "hostname";
    args.clear();
    p.start( command,args );
    p.waitForFinished();
    strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
    hostname = strTemp.replace( "\n","").trimmed();
    qDebug()<<"hostname:"<< hostname;

    return hostname;
}

QString PCInfo::getLoginUser(){

   /**
     * 调用 whoami 命令  获取当前登录用户
     ================================================================ */
    QProcess p;
    QString command = "";
    QStringList args;
    QString strTemp = "";
    QStringList tmpList;

    command = "whoami";
    args.clear();
    p.start(command,args);
    p.waitForFinished();
    strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
    QString LoginUser = strTemp.trimmed();
    qDebug()<<"LoginUser:"<< LoginUser;

    return LoginUser;

}

QString PCInfo::getAppTable(){

  /**
    * QDBusInterface 获取应用列表
    ================================================================ */
   qRegisterMetaType<ItemInfo>("ItemInfo");
   qRegisterMetaType<QList<ItemInfo>>("ItemInfoList");

   qDBusRegisterMetaType<ItemInfo>();
   qDBusRegisterMetaType<QList<ItemInfo>>();

   QDBusInterface interface("com.deepin.dde.daemon.Launcher",
                                "/com/deepin/dde/daemon/Launcher",
                                "com.deepin.dde.daemon.Launcher");

   auto message = interface.call("GetAllItemInfos");
   //qDebug() << message.signature() ;
   QDBusReply<QList<ItemInfo>> reply(message);
   //qDebug() << reply.value();
   //qDebug() << reply.value().count();
   QString AppTable = "";
   foreach( ItemInfo iteminfo,reply.value() ){

         //qDebug() << iteminfo.v1 << iteminfo.v2 << iteminfo.v3 << iteminfo.v4;
/**
         if( iteminfo.v2.indexOf("深度") < 0 ){ //忽略深度自带软件,

             AppTable += iteminfo.v2 + ",";
         }
**/

         AppTable += iteminfo.v2 + ",";
   }

   return AppTable;

}



QString PCInfo::getWorkLog(){

    /**
     * 调用 last 命令 抓取开机/登录/关机日志记录
     * last reboot --time-format iso
     ================================================================ */
    QProcess p;
    QString command = "";
    QStringList args;
    QString strTemp = "";
    QStringList tmpList;

    command = "last";
    args.clear();
    args.append("reboot");
    args.append("--time-format");
    args.append("iso");
    p.start(command,args);
    p.waitForFinished();
    strTemp = QString::fromLocal8Bit( p.readAllStandardOutput() );
    QStringList rebootlogList = strTemp.split("\n");
    QString rLogstr = "";
    foreach( QString str,rebootlogList ){

       if ( str == "" || str.indexOf( "still running" ) >= 0 || str.indexOf("wtmp begins") >= 0   ){
           continue;
       }
       qDebug()<<QString("[%1]").arg(str);
       //rLogstr += str+","; // 精减
       rLogstr = str; break; // 只要最后一次
    }

    return rLogstr;
}