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.hqwc.cn/news/219166.html

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

相关文章

Hibernate 脏检查和刷新缓存机制

刷新缓存: Session是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的保存,更新,删除和加载java对象的方法,Session具有一个缓存,可以管理和追踪所有持久化对象,对象和数据库中的相关记录对应,在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对…

贝叶斯个性化排序损失函数

贝叶斯个性化排名&#xff08;Bayesian Personalized Ranking, BPR&#xff09;是一种用于推荐系统的机器学习方法&#xff0c;旨在为用户提供个性化的排名列表。BPR的核心思想是通过对用户历史行为数据的分析&#xff0c;对用户可能喜欢和不喜欢的物品对&#xff08;item pair…

[网鼎杯 2020 青龙组]singal

一道VM题目 可以看到长度是15 跟踪调用read函数的函数 分析一下switch中每个指令的含义、 在scanf下面打断点 在关键跳转处下断点 打开Ponce插件 GitHub - illera88/Ponce: IDA 2016 plugin contest winner! Symbolic Execution just one-click away! 然后开始动调 输入15个…

【LeetCode:828. 统计子串中的唯一字符 | 贡献法 乘法原理】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

bit_set位图|布隆过滤器

位图 对于海量整形数据的处理&#xff0c;通常是上百个G的代码。 通常有如下的应用&#xff1a; 1. 快速查找某个数据是否在一个集合中 2. 排序 去重 3. 求两个集合的交集、并集等 4. 操作系统中磁盘块标记 如果将数据加载到内存中&#xff0c;运用基本数据结构处理&…

基于springboot实现实习管理系统的设计与实现项目【项目源码+论文说明】

基于sprinmgboot实现实习管理系统的设计与实现演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;…

②⑩① 【MySQL】什么是分库分表?拆分策略有什么?什么是MyCat?

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 ②⑩① 【MySQL】什么是分库分表&#xf…

Scope 模块

Scope 模块可以连接任何类型的实数信号线 (不支持复数)。 波形显示界面主要包括两个部分: Scope 独有的工具栏、波形显示区域。 波形显示界面默认是黑色背景, 当有单个信号输入时, 信号线是黄色的。 Scope 模块也有菜单栏, 只不过默认将其句柄和显示都隐藏起来, 可以通过下面…

C3 多媒体查询

文章目录 前言CSS3 多媒体查询CSS2 多媒体类型CSS3 多媒体查询浏览器支持多媒体查询语法CSS3 多媒体类型多媒体查询简单实例 媒体类型媒体功能更多实例后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;CSS &#x1f431;‍&#x1f453;博…

队列实现栈VS栈实现队列

目录 【1】用队列实现栈 思路分析 ​ 易错总结 Queue.c&Queue.h手撕队列 声明栈MyStack 创建&初始化栈myStackCreate 压栈myStackPush 出栈&返回栈顶元素myStackPop 返回栈顶元素myStackTop 判断栈空否myStackEmpty 释放空间myStackFree MyStack总代码…

BER编码规则

文章目录 一、BER 编码规则介绍二、BER编码数据组成三、Identifier octets Type1. tag class 分类2. p/c 分类3 tag type4. ASN.1的原始数据类型&#xff08;TAG&#xff09; 四、 Length octets1、定长的短格式2、不定长格式3、保留格式 五、Contents octets六 、BER编码番外 …

2024年天津天狮学院专升本食品质量与安全专业《分析化学》考纲

2024年天津天狮学院食品质量与安全专业高职升本入学考试《分析化学》考试大纲 一、考试性质 《分析化学》专业课程考试是天津天狮学院食品质量与安全专业高职升本入学考试 的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《…