程序内执行shell命令自动获取局域网内所有在线IP和开放端口(Linux)

2023-10-27

前言

        题目说的有点长,其实就是以下几件事,第一是让Shell命令可以在程序内执行,然后将执行结果传递给变量,从而可以进行后续的事务处理,第二是使用nmap命令获取当前局域网内所有在线IP和开放的端口,最后就是对nmap获得的结果进行处理,得到只有IP和端口的结果。

        Linux命令行的强大功能相信使用Linux的人都知道,一个命令等于你在windows用几百行甚至上千行的代码量才能实现,所以,如果很好的利用shell命令,可以说是事半功倍。

        而要充分利用shell的结果,必然是需要获得可以处理的命令返回结果。

程序内执行Shell命令

        主要是利用以下的函数:

        函数定义:

#include <stdio.h>

FILE * popen(const char *command , const char *type );
int pclose(FILE *stream);

 

        函数说明:

        popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。这个管道必须由pclose()函数关闭,而不是fclose()函数。pclose()函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。如果shell不能被执行,则pclose()返回的终止状态与shell已执行exit一样。

  type参数只能是读或者写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r"则文件指针连接到command的标准输出;如果type是"w"则文件指针连接到command的标准输入。

  command参数是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到bin/sh并使用-c标志,shell将执行这个命令。

  popen()的返回值是个标准I/O流,必须由pclose来终止。前面提到这个流是单向的(只能用于读或写)。向这个流写内容相当于写入该命令的标准输入,命令的标准输出和调用popen()的进程相同;与之相反的,从流中读数据相当于读取命令的标准输出,命令的标准输入和调用popen()的进程相同。

      返回值:

  如果调用fork()或pipe()失败,或者不能分配内存将返回NULL,否则返回标准I/O流。popen()没有为内存分配失败设置errno值。如果调用fork()或pipe()时出现错误,errno被设为相应的错误类型。如果type参数不合法,errno将返回EINVAL。

      使用方法:

//execute shell command
//执行一个shell命令,输出结果逐行存储在resvec中,并返回行数
int32_t myexec(const char *cmd, vector<string> &resvec) {
    resvec.clear();
    FILE *pp = popen(cmd, "r"); //建立管道
    if (!pp) {
        return -1;
    }
    char tmp[1024]; //设置一个合适的长度,以存储每一行输出
    while (fgets(tmp, sizeof(tmp), pp) != NULL) {
        if (tmp[strlen(tmp) - 1] == '\n') {
            tmp[strlen(tmp) - 1] = '\0'; //去除换行符
        }
        resvec.push_back(tmp);
    }
    pclose(pp); //关闭管道
    return resvec.size();
} 

 

使用nmap获取所有在线IP和开放端口

        强大的nmap,具体介绍网上太多了,附上官网http://nmap.org/ ,使用以下命令

nmap -sT 192.168.1.0/24

       对C类网段进行扫描,得到结果图截图,格式如图,查看格式可以方便后续对结果的处理:

 

       如果是B类网段,则改成:

nmap -sT 192.168.*.*/24

 

对结果进行处理

        处理的目标主要是要直接获得IP地址和对应的端口号,保存到向量数组中,然后方便后续的处理,处理代码如下:

<p>int32_t get_ip_port( vector<string> input,map<string,vector<string> > &result)
{
 result.clear();
 vector<string>::iterator it=input.begin()+2;
 int flag=0;
    const char* IP=new char(24);
 vector<string> tmp;
 while(it!=input.end()-1)
 {
  if((*it)[0]!='\0')
  {
   flag++;
   if(flag==1)
   {
    //get IP address and push_back a pair to reslut
    IP=it->data()+21;
   }
   else if(flag>4)
   {
    //get port information
    string s=*it;
    char cc;
    bool end=false;
    for(int i=0;(cc=s[i])!='\0';i++)
    {
     if(cc=='/')
     {
      s[i]='\0';
      end=true;
     }
     if(end)
     {
      s[i]='\0';
     }
    }
    //if(atoi(Port)>102i4){
    tmp.push_back(s);
    //}
   }
   ++it; 
  }
  else
  {
   flag=0;
   result.insert(pair<string,vector<string> >(IP,tmp));
   tmp.clear();
   ++it;
  }
 }
 return 1;</p><p>}</p>

 

结果

 

       目前处理起来速度是比较慢的,后续看是否可以对速度有所提升,欢迎交流。虽然这些网络的识别技术对于做系统的开发人员来说非常有用,但是同时也给了恶意黑客们很多机会,所以有利有弊。

 

转载请注明出处:http://blog.csdn.net/luoyun614/article/details/42967695


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序内执行shell命令自动获取局域网内所有在线IP和开放端口(Linux) 的相关文章

随机推荐

  • Android中导入Unity项目,界面点击事件失去焦点问题

    问题描述 1 将Unity中的项目导出成Android项目 再放入到Eclipse中 然后新建一个Android项目 以Unity那个项目为类库 2 然后我开始写一个xml布局 布局中间是一个LinearLayout 上下分别是Button
  • Linux环境部署ElasticSearch+Kibana

    ES kibana部署 1 安装包 1 1 jdk1 8 1 2 ES7 6 0 2 解压安装包并重命名 解压java tar zxvf java安装包名 重命名 MV java安装包名 java8 解压ES tar zxvf elasti
  • 为什么在查询的时候varchar类型的数据不使用引号包裹也不会报错?

    在数据库查询时 对于 VARCHAR 类型的数据 通常情况下使用引号包裹是必要的 因为字符串类型的数据需要使用引号来表示其值 然而 有些数据库管理系统 如MySQL 具有一定的灵活性 在某些情况下允许在查询中省略对 VARCHAR 类型数据
  • 记录好项目D18

    记录好项目 你好呀 这里是我专门记录一下从某些地方收集起来的项目 对项目修改 进行添砖加瓦 变成自己的闪亮项目 修修补补也可以成为毕设哦 本次的项目是个网上商城 一 系统介绍 前台商城系统 包含首页登录 商品分类 新品上线 首页轮播 商品推
  • 中tab设置_键盘侠丨Tab键的妙用(下)

    Tab键的妙用 下 How to zhuangbility 键盘是我们办公设备中极为重要的组成部分 学会灵活运用键盘上的按键 不仅能大大提高工作的效率 还能让你看起来自带一股高人 zhuangbility 风范 在这个系列中 我们将带你挖掘
  • 理解vue-element-admin 的登录流程

    1 首先 点击登录按钮 触发handleLogin方法 通过 this store dispatch user login this loginForm 调用vuex中login方法 此处user login表示的是调用user文件下的lo
  • flutter自动更新

    一 应用程序升级流程 本文仅介绍Android App的升级流程 1 获取本地apk版本号 2 请求接口获取服务器版本号和更新包地址 3 如果本地版本和服务器版本不一致则提示升级 弹窗更新提示框 4 用户确定升级 调用文件传输方法下载apk
  • sklearn决策树中的random_state的作用

    疑惑点 决策树的随机性来自于哪里
  • proto文件生成教程

    来源 https www cnblogs com jbw752746541 p 10973200 html 首先贴一下Protobuf各个版本历史下载链接 https github com protocolbuffers protobuf
  • 无向图G的邻接矩阵法和邻接表法以及遍历输出无向图G包括两种存储的FirstNeighbor和NextNeighbor两种基本操作

    一 邻接矩阵法 将下列图G用邻接矩阵法进行存储 圆圈中的字符 是顶点的值 圆圈旁边的数字 是顶点的序号 边线上的值 是两个顶点之间的权值 1 结构体 define MaxVertexNum 10 typedef char VerTexTyp
  • JAVA电商平台免费搭建 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城

    1 涉及平台 平台管理 商家端 PC端 手机端 买家平台 H5 公众号 小程序 APP端 IOS Android 微服务平台 业务服务 2 核心架构 Spring Cloud Spring Boot Mybatis Redis 3 前端框架
  • 关于nmealib库的学习

    调用流程 前部分的调用流程如下 nmea parse gt nmea parser push parser buff buff sz gt nparsed nmea parser real push parser buff nparse g
  • [HLS]HTTP Live Streaming流与TS流比较

    转自 http www cuplayer com player PlayerCode FMS 2013 0725 905 4 html 你说的应该是 HTTP Live Streaming 1 吧 这个是 Apple 为了提高流播效率开发的
  • 面向对象编程及其三大特征(JAVA)

    面向对象编程及其三大特征 JAVA 一 面向对象编程介绍 面向过程与面向对象 面向对象的本质 二 面向对象编程的三大特征 封装 封装的概念 封装的优点 封装举例 Person类 继承 继承的概念 继承的优点 继承类型 继承注意事项 继承举例
  • 【2023B题】人工智能对大学生学习影响的评价(思路、代码)

    目录 1 概述 2 Matlab代码实现 3 参考文献 4 运行结果 1 概述 人工智能简称AI 最初由麦卡锡 明斯基等科学家于1956年在美国达特茅斯学院开会研讨时提出 2016年 人工智能AlphaGo 4 1战胜韩国围棋高手李世石 期
  • MATLAB人脸检测算法

    MATLAB人脸检测算法 人脸检测是将人脸从复杂的背景图像中检测出来 它是实现人脸识别的基础和前提 肤色重建 使用人脸肤色模板对灰度图像进行肤色重建 使其变成彩色图像 效果如下 在函数function R gray2rgb1 img1 im
  • Qt 程序获取各种文件路径方法

    Qt 程序获取程序所在路径 用户目录路径 临时文件夹等特殊路径的方法 经常我们的程序中需要访问一些特殊的路径 比如程序所在的路径 用户目录路径 临时文件夹等 在 Qt 中实现这几个功能所用的方法虽然都不难 但是各不相同 每次用到时还要现去查
  • 20张原版Python科学速查表,数据分析不再是难题

    1 Python基础 2 Pandas基础 3 Numpy基础 4 PySpark基础 5 数组排序算法 6 scikit learn算法小抄 内容就不给大家一一自行领取哦
  • 编译UNP源码

    读UNP需要用到官方的源码 记录一下折腾的记录 源码下载地址 http www unpbook com 下载源码后 解压出文件夹unpv13e cd进入后 依次进行下面操作 configure cd lib make 这两步没有问题 出现w
  • 程序内执行shell命令自动获取局域网内所有在线IP和开放端口(Linux)

    前言 题目说的有点长 其实就是以下几件事 第一是让Shell命令可以在程序内执行 然后将执行结果传递给变量 从而可以进行后续的事务处理 第二是使用nmap命令获取当前局域网内所有在线IP和开放的端口 最后就是对nmap获得的结果进行处理 得