C++ 通过SQLite实现命令行工具

本文介绍了一个基于 C++、SQLite 和 Boost 库的简单交互式数据库操作 Shell。该 Shell 允许用户通过命令行输入执行各种数据库操作,包括添加、删除主机信息,设置主机到特定主机组,以及显示主机和主机组列表。通过调用 SQLite3 库实现数据库连接和操作,以及使用 Boost 库进行字符串解析和格式化。该交互式 Shell 提供了一些基本的命令,使用户能够方便地管理主机信息和组织结构。代码结构清晰,易于理解,可根据需要扩展和定制功能。

数据库的基本使用方法请看《C/C++ 通过SQLiteSDK增删改查》这篇文章,针对如何使用Boost解析命令行参数请看《4.9 C++ Boost 命令行解析库》这篇文章,此处只给出实现代码,如下所示;

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <time.h>
#include "sqlite3.h"#include <boost/format.hpp>
#include <boost/tokenizer.hpp>
#include <boost/lexical_cast.hpp>using namespace std;
using namespace boost;sqlite3* open_database(std::string database_name)
{int ref = -1;sqlite3 *db = 0;ref = sqlite3_open(database_name.c_str(), &db);if (ref == SQLITE_OK)return db;return false;
}
bool close_database(sqlite3 *db)
{int ref = sqlite3_close(db);if (ref == SQLITE_OK)return true;return false;
}
bool exec_sql(sqlite3 *db, char *sql)
{char *error_code = 0;int ref = sqlite3_exec(db, sql, 0, 0, &error_code);if (ref == SQLITE_OK){return true;}return false;
}// 初始化创建表结构
void Init_Database()
{sqlite3* open_db = open_database("./database.db");if (open_db != false){std::string sql ="create table HostDB(""uid primary key,""host_address char(128) not null,""host_username char(128) not null,""host_password char(128) not null,""host_port char(128) not null,""host_group char(128) not null default 'DefaultGroup'"");";char run_sql[1024] = { 0 };strcpy(run_sql, sql.c_str());exec_sql(open_db, run_sql);}close_database(open_db);
}// 增加一条主机记录
void AddHost_DB(sqlite3* open_db, std::string address, std::string username, std::string password, std::string port)
{std::string format_string = boost::str(boost::format("insert into HostDB(host_address,host_username,host_password,host_port) values('%s','%s','%s','%s');") % address %username %password %port);char run_sql[2048] = { 0 };strcpy(run_sql, format_string.c_str());bool ref = exec_sql(open_db, run_sql);if (ref == true){std::cout << "[+] 增加主机: " << address << " 完成" << std::endl;}
}// 删除特定主机记录
void DeleteHost_DB(sqlite3 *open_db, std::string address)
{std::string format_string = boost::str(boost::format("delete from HostDB where host_address = '%s';") % address);char run_sql[2048] = { 0 };strcpy(run_sql, format_string.c_str());bool ref = exec_sql(open_db, run_sql);if (ref == true){std::cout << "[-] 删除主机: " << address << " 完成" << std::endl;}
}// 将特定主机加入到特定主机组
void SetHostGroup_DB(sqlite3* open_db, std::string address, std::string group_name)
{std::string format_string = boost::str(boost::format("update HostDB set host_group='%s' where host_address = '%s';") % group_name %address);char run_sql[2048] = { 0 };strcpy(run_sql, format_string.c_str());bool ref = exec_sql(open_db, run_sql);if (ref == true){std::cout << "[+] 主机: " << address << " 已加入到: " << group_name << " 组" << std::endl;}
}// 输出所有主机组
void ShowHostGroup_DB(sqlite3 *open_db)
{sqlite3_stmt *stmt = 0;// std::string format_string = "SELECT distinct(host_group) FROM 'HostDB';";std::string format_string = "SELECT host_group,count(*) FROM HostDB GROUP BY host_group;";char run_sql[1024] = { 0 };strcpy(run_sql, format_string.c_str());int ref = sqlite3_prepare_v2(open_db, run_sql, -1, &stmt, 0);if (ref == SQLITE_OK){while (sqlite3_step(stmt) == SQLITE_ROW){const unsigned char *host_group = sqlite3_column_text(stmt, 0);int host_group_count = sqlite3_column_int(stmt, 1);std::cout << host_group << "                    " << host_group_count << std::endl;}}sqlite3_finalize(stmt);
}// 输出所有主机
void ShowHost_DB(sqlite3 *open_db)
{sqlite3_stmt *stmt = 0;std::string format_string = "select * from HostDB;";char run_sql[1024] = { 0 };strcpy(run_sql, format_string.c_str());int ref = sqlite3_prepare_v2(open_db, run_sql, -1, &stmt, 0);if (ref == SQLITE_OK){while (sqlite3_step(stmt) == SQLITE_ROW){const unsigned char *host_address = sqlite3_column_text(stmt, 1);const unsigned char *host_username = sqlite3_column_text(stmt, 2);const unsigned char *host_paddword = sqlite3_column_text(stmt, 3);const unsigned char *host_port = sqlite3_column_text(stmt, 4);const unsigned char *host_group = sqlite3_column_text(stmt, 5);std::cout << host_address << "     "<< host_username << "     "<< host_paddword << "     "<< host_port << "     "<< host_group << std::endl;}}sqlite3_finalize(stmt);
}// 输出特定主机组中的主机
void ShowGroupHostList(sqlite3 *open_db, std::string group_name)
{sqlite3_stmt *stmt = 0;std::string format_string = boost::str(boost::format("select * from HostDB where host_group = '%s';") % group_name);char run_sql[2048] = { 0 };strcpy(run_sql, format_string.c_str());int ref = sqlite3_prepare_v2(open_db, run_sql, -1, &stmt, 0);if (ref == SQLITE_OK){std::cout << "----------------------------------------------------------" << std::endl;std::cout << "主机组: " << group_name << std::endl;std::cout << "----------------------------------------------------------" << std::endl;while (sqlite3_step(stmt) == SQLITE_ROW){const unsigned char *host_address = sqlite3_column_text(stmt, 1);const unsigned char *host_username = sqlite3_column_text(stmt, 2);const unsigned char *host_port = sqlite3_column_text(stmt, 4);std::cout << host_address << "     "<< host_username << "     "<< host_port << std::endl;}}sqlite3_finalize(stmt);
}int main(int argc, char const *argv[])
{sqlite3* open_db = open_database("./database.db");Init_Database();std::string command;while (1){std::cout << "[ LyShark Shell ] # ";std::getline(std::cin, command);if (command.length() == 0){continue;}else if (command == "help"){std::cout << "帮助菜单" << std::endl;}else{boost::char_separator<char> sep(", --");typedef boost::tokenizer<boost::char_separator<char>> CustonTokenizer;CustonTokenizer tok(command, sep);std::vector<std::string> vecSegTag;for (CustonTokenizer::iterator beg = tok.begin(); beg != tok.end(); ++beg){vecSegTag.push_back(*beg);}if (vecSegTag.size() == 9 && vecSegTag[0] == "AddHost"){if (vecSegTag[1] == "address" && vecSegTag[3] == "username" && vecSegTag[5] == "password" && vecSegTag[7] == "port"){std::string set_address = vecSegTag[2];std::string set_username = vecSegTag[4];std::string set_password = vecSegTag[6];std::string set_port = vecSegTag[8];AddHost_DB(open_db, set_address, set_username, set_password, set_port);}}else if (vecSegTag.size() == 3 && vecSegTag[0] == "DeleteHost"){if (vecSegTag[1] == "address"){std::string set_address = vecSegTag[2];DeleteHost_DB(open_db, set_address);}}else if (vecSegTag.size() == 5 && vecSegTag[0] == "SetHostGroup"){if (vecSegTag[1] == "address" && vecSegTag[3] == "group"){std::string set_address = vecSegTag[2];std::string set_group = vecSegTag[4];SetHostGroup_DB(open_db, set_address, set_group);}}else if (vecSegTag.size() == 1 && vecSegTag[0] == "ShowHost"){std::cout << "-----------------------------------------------------------------------------" << std::endl;std::cout << "IP地址     " << "用户名     " << "密码     " << "端口号     " << "默认组     " << std::endl;std::cout << "-----------------------------------------------------------------------------" << std::endl;ShowHost_DB(open_db);}else if (vecSegTag.size() == 1 && vecSegTag[0] == "ShowHostGroup"){std::cout << "-----------------------------------------------------------------------------" << std::endl;std::cout << "主机组名     " << "主机数量     " << std::endl;std::cout << "-----------------------------------------------------------------------------" << std::endl;ShowHostGroup_DB(open_db);}else if (vecSegTag.size() == 3 && vecSegTag[0] == "ShowGroupHostList"){if (vecSegTag[1] == "group"){std::string set_group = vecSegTag[2];ShowGroupHostList(open_db, set_group);}}}}close_database(open_db);return 0;
}

添加主机记录: AddHost --address 192.168.1.1 --username root --password 1233 --port 22

删除主机记录: DeleteHost --address 192.168.1.1

将特定主机设置到主机组: SetHostGroup --address 192.168.1.1 --group WebServer

输出所有主机列表: ShowHost

输出所有主机组: ShowHostGroup

输出特定主机组中的主机: ShowGroupHostList --group DefaultGroup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全】meterpreter攻击实战

1.meterpreter 攻击成功后可以做什么指令&#xff1f; 远程控制命令执行摄像头监控密码获取创建后门用户破坏篡改系统。 2.创建后门用户并开启远程连接&#xff1a; net user zhangsan 123456/add && net localgroup adminstrators zhangsan/add exit run getgul -…

拓数派荣获上海市“智慧工匠”工业软件创新案例奖

近日&#xff0c;由上海市经济和信息化委员会指导、上海市城市数字化转型应用促进中心主办、上海中创产业创新研究院承办的“工业软件赋能新型工业化”主题沙龙暨2023“智慧工匠”工业软件创新案例竞赛颁奖典礼在上海圆满落幕。拓数派凭借上汽集团工业数据管理服务平台案例成功…

ROS vscode使用基本配置

1、创建ros工作空间 2、启动 vscode 3、vscode 中编译 ros ctrl shift B 调用编译&#xff0c;选择:catkin_make:build 修改.vscode/tasks.json 文件 4、 创建 ROS 功能包 选定 src ---> create catkin package 依次设置包名、添加依赖 5、C 实现 在功能包的 src 下…

Yolov8训练数据集过程 + 测试测试集 + 继续训练+报错解决

做自己第一次使用Yolov8训练的记录 1、下载代码 官网的我没找到对应的视频教程&#xff0c;操作起来麻烦&#xff0c;一下这个链接的代码可以有对应bilibili教程&#xff1a;完整且详细的Yolov8复现训练自己的数据集 选择这个下载&#xff1a; 2、安装需要的包&#xff1a; …

扫码听音乐该如何制作?音乐的二维码生成方法

多个音频文件怎么做成一个二维码显示&#xff1f;二维码在现在的生活中拥有丰富的使用场景&#xff0c;可以用来作为多种内容类型的载体&#xff0c;比如音频二维码就是经常被使用的一种二维码类型。通过扫秒二维码来听音频文件&#xff0c;更加的灵活方便&#xff0c;那么音频…

MySQL C代码连接

环境&#xff1a;5.7.42-0ubuntu0.18.04.1 (Ubuntu) mysql接口介绍 初始化mysql指针 用来生成MySQL对象&#xff0c;返回值为MySQL*&#xff0c;MySQL*是MySQL对象的指针。 MySQL在mysql.h中是一个结构体 链接数据库 初始化完毕之后&#xff0c;必须先链接数据库&#xff…

安防监控系统的工作原理是什么?具体包含哪些组成部分?

关于安防监控系统&#xff0c;大家熟知的就是监控系统平台&#xff0c;其实不然&#xff0c;智能视频安防监控系统涵盖的内容非常多&#xff0c;今天小编就和大家一起来探讨一下。 安防监控视频系统主要分为以下7大类&#xff1a; 1、 摄像头采集图像 安防监控系统通常使用摄…

11-30 SpringBoot

内嵌的tomcat tomcat的依赖 对于tomcat其实还是一个jar包 spring是一个IOC容器 tomcat的核心对象交给Spring容器 调用核心对象方法 启动Tomcat 1.添加依赖 tomcat-embed-core&#xff0c;叫做tomcat内嵌核心。就是这个东西把tomcat功能引入到了我们的程序中的 排除tomcat&a…

Nginx(无法解析PHP网页如何解决?FPM解决你的烦恼!)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

Android笔记(十六):前台服务

设置服务为前台服务。前台服务会在状态栏显示一个通知。通知界面与服务进行关联。 一、什么是通知&#xff1f; Notification通知是在移动应用APP提供给用户的消息提示&#xff0c;是在移动系统的通知栏中显示。当移动应用不在运行时或者在后台状态下&#xff0c;通过发布通知…

数据挖掘实战-基于word2vec的短文本情感分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

易点易动固定资产管理系统:提升企业固定资产管理效率的利器

固定资产是企业运营中重要的组成部分&#xff0c;对于企业的正常运转和发展至关重要。然而&#xff0c;传统的固定资产管理方法通常存在效率低下、信息不透明等问题。为了解决这些挑战&#xff0c;易点易动固定资产管理系统应运而生。本文将探讨易点易动固定资产管理系统的概念…

9款高效绘图神器,提升你的工作效率

在日常工作或生活中&#xff0c;我们必须绘制各种图表、流程图、思维导图等图形&#xff0c;或者想用画笔描述自己的想法。然而&#xff0c;我们在许多绘图软件面前感到困惑。我们不知道哪个绘图软件好&#xff0c;也没有足够的时间一一尝试 在接下来的空间里&#xff0c;我们…

堆栈_有效括号

题比较特殊&#xff0c;主要在于它的所有要输入&#xff0c;都是左括号开头&#xff0c;没有右括号开头的&#xff0c;比如"] ["&#xff0c;这种是不算为括号的&#xff0c;由于必然是对称的&#xff0c;若能符合&#xff0c;因而直接在遇到右括号时&#xff0c;检查…

基于python实现心血管疾病风险预测分析

一、项目简介 项目背景 利用心血管疾病风险预测数据集进行深入分析&#xff0c;探究不同因素与心血管疾病风险之间的关联。 数据源 Kaggle上的心血管疾病风险预测数据集。&#xff08;Cardiovascular Diseases Risk Prediction Dataset | Kaggle&#xff09; 二、数据预处…

视图层、模板(补充)

视图层 响应对象 响应---》本质都是 HttpResponse HttpResponse---》字符串render----》放个模板---》模板渲染是在后端完成 js代码是在客户端浏览器里执行的模板语法是在后端执行的redirect----》重定向 字符串参数不是是空的状态码是 3开头JsonResponse---》json格式数据 …

Moonbeam生态项目分析 — — DeFi借贷协议Moonwell

流动性激励计划Moonbeam Ignite是帮助用户轻松愉快体验Moonbeam生态的趣味活动。在Moonbeam跨链连接的推动下&#xff0c;DeFi的各种可能性在这里爆发。DeFi或许不热门&#xff0c;但总有机会捡漏&#xff0c;了解Monbeam生态项目&#xff0c;我们邀请Moonbeam大使分享他们的研…

【linux防火墙】设置开启路由转发,SNAT和DNAT转换原理及应用实操,添加自定义链归类iptables规则

目录 一、关于iptables规则的保存 1.1持久保存规则 1.2加载规则 1.3开机自动加载规则 1.4使用iptables-service软件来进行规则的保存和加载&#xff08;不建议使用&#xff09; 二、SNAT和DNAT的原理和应用 SNAT的原理与应用&#xff1a; DNAT的原理和应用&#xff1a; …

在java java.util.Date 已知逝去时间怎么求年月日 数学计算不用其他方法

在Java中&#xff0c;使用java.util.Date类已知逝去时间求年月日的方法如下&#xff1a; 首先&#xff0c;获取当前时间和逝去时间之间的毫秒数差值&#xff0c;可以使用Date类的getTime()方法获得时间戳。 将毫秒数转换为秒数&#xff0c;并计算出总共的天数。 根据总共的天…

应用软件快速开发平台,一起实现办公流程化发展!

做好办公流程化发展能给企业带来什么好处&#xff1f;其实&#xff0c;在快节奏发展社会中&#xff0c;很多企业的规模和业务量也在不断扩展中&#xff0c;如果还是懒散的办公方式是不能达到事半功倍的效果的。要想实现高效率发展&#xff0c;采用办公流程化发展能让企业管理朝…