程序内执行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) 的相关文章

  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • vim 脚本“input()”函数不需要用户按 Enter 键

    我想让用户调用我的函数 然后让该函数请求用户输入 但我不希望用户在输入 input 函数所需的字母后必须输入 enter 例如 用户应该能够键入 h j k l 等单字母命令 并且键入的每个字母都会在我的函数中循环 直到用户键入 x 退出
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 如何设置 Vim 进行 Android 开发?

    谁能描述一下用于 Android 开发的良好 Vim 设置吗 我现在使用 Eclipse 但我真的很想使用 Vim 因为它更快 而且我更喜欢它 例如 我对 Eclim 不感兴趣 我对使用哪些 Vim 插件 用于 Java 自动完成等 如何
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 如何成功使用 VIM 作为 Code::Blocks 的外部编辑器?

    我真的很喜欢 Code Blocks 的构建系统和单步调试能力 也就是说 我真的很喜欢使用 gcc gdb 的包装器 而不是从 Makefile 或命令行使用它们 问题是 多年来使用 VIM 使我的大脑受到了严重损伤 或者有些人可能会说被宠
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu

随机推荐

  • 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获得的结果进行处理 得