Linux系统应用与开发教程 第二版 刘海燕 荆涛综合实验

发布时间 : 星期三 文章Linux系统应用与开发教程 第二版 刘海燕 荆涛综合实验更新完毕开始阅读

其中-o选项指定编译后的可执行文件名,-l选项表示使用crypt函数库 步骤7:执行口令检查程序

./passchk –P myshadow –w words –p

其中passchk是可执行文件名,myshadow是口令文件,如果没有-P选项,则缺省使用Linux系统的/etc/shadow文件,words是存放弱口令的口令字典文件,选项-p表示将破解后的口令输出。

实验5

目的:练习Gtk+编程和gcc工具的使用。

需要的知识:C/C++语言的基本技能、第12章gcc的使用与开发、第13章Gtk+图形程序设计;

题目:日志的查询统计是系统管理的一项重要任务。Linux系统的日志以文本文件的形式存在,使用Gtk+编写一个图形界面的系统日志管理器(针对日志文件/var/log/messages*),它可以列出系统当前的日志个数(/var/log/message, /var/log/message.1, /var/log/message.2,……共多少个),对指定的日志文件可以查询哪些条目含有(include)指定信息(比如含有“succeed”的条目),哪些不含有(exclude)指定信息。 图5-1是一个示例程序的效果图:

? 数字1为一个标签,显示日志文件的数量;

? 显示succeed的单行文本框用来输入包含的指定信息; ? 显示kernel的单行文本框用来输入不包含的指定信息;

? 点击标签为“/var/log/messages”的按钮后,可以选择日志文件; ? 点击标签为“View”的按钮后,可以根据输入的条件查看日志内容; 下面的多行文本框用来显示日志内容。

图5-1程序效果图

程序目录结构如图 5- 1所示:

Util.h,Util.cpp core/ LogRecord,LogRecord.cpp LogContent,LogContent.cpp 当前目录./ widgets/ widget.h,widget.cpp main.cpp 图 5- 1程序目录结构图

其中:

? 文件main.cpp:为程序的主函数所在文件,通过对其它文件的调用启动和结束程序; ? 目录core:其中的文件分为三组,每一组的一个.h文件和一个.cpp文件共同定义了一个

类,其中的类名和对应的文件名相同。目录core下定义的类实现了与界面无关的大部分功能。包括:检索日志文件个数、检索和根据条件过滤日志内容等作用。

? 目录widgets:包括两个文件,实现程序界面,并和目录core下的类交互,利用图形界

面接收用户的输入和显示程序的运行结果。 实现步骤:

1) 根据目录结构创建目录和文件;

为了方便组织程序代码,可以将本实验的代码放到单独的目录下。因此,先建立一个目录作为项目的根目录,本例中根目录命名为:ViewLogGtk。

? 在当前工作目录下,建立项目根目录:mkdir ViewLogGtk ? 进入根目录:cd ViewLogGtk

? 创建空白主程序文件:touch main.cpp ? 创建目录core:mkdir core

? 创建目录widgets:mkdir widgets ? 进入目录core:cd core

? 创建目录core下的空白程序文件:

touch Util.h touch Util.cpp

touch LogRecord.h touch LogRecord.cpp touch LogContent.h touch LogContent.cpp

? 进入目录widgets:cd ../widgets

? 创建目录widgets下的空白程序文件:

touch widget.h touch widget.cpp ? 目录文件创建完毕。

Util.h 1 2 3 4 5 6 7 #ifndef UTIL_H #define UTIL_H class Util{ public: static int queryFileCount(const char* dir,const char* keyword); }; #endif 2) 编辑并实现代码文件:这里仅给出关键部分的代码。 Util.h定义了类Util:

类Util中只定义了一个静态的方法:queryFileCount()用来查询指定目录下指定类型的文件个数。其中方法的第一个参数为指定查询文件的目录,第二个参数为指定文件名中包含的字符串。对于本例,第一参数固定的传入字符串“/var/log/”,第二个参数固定的传入字符串“message”,即查询目录/var/log/下文件名中包含message的文件。

LogRecord.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #ifndef LOGRECORD_H #define LOGRECORD_H #include using namespace std; class LogRecord { private: string contents; public: LogRecord(char* contents); ~LogRecord(void); string getContents(void); LogRecord(string contents); }; #endif 类LogRecord代表日志中每一行。构造函数LogRecord(char*)和LogRecord(string)分别提供了利用char*类型和string类型形成日志行记录的两种方法。其中私有字符串成员contents储存日志记录的一行字符串,公有方法getContents()对外提供了一个获得字符串记录内容的接口。

LogContent.h 1 2 3 4 5 6 7 8 9 #ifndef LOGCONTENT_H #define LOGCONTENT_H #include #include #include%using namespace std; class LogContent { private: 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 string contains; //记录中需要出现的关键字 string notcontains; //记录中不能出现的关键字 string file_name; //记录文件名 list records; //符合过滤条件的记录集合 public: LogContent(void); ~LogContent(void); void setFilter(string contains, string not_contains); //设置过滤条件 void set_file_name(string file_name); //设置检索的日志记录文件名 int fill_records(void); //根据文件、过滤条件填充记录集合 private: int filter_record(LogRecord record); //判断记录行是否满足过滤条件 public: list get_records(void); //得到记录集合 }; #endif 类LogContent是检索日志文件、过滤日志行记录的主要场所。它利用setFilter(string,string),设置日志行记录中必须出现的关键字和必须不出现的关键字,利用set_file_name(string)设置日志文件的文件名称。检索关键字和日志文件设置完毕后,就可以利用fill_record()检索日志文件并填充日志行记录集合。填充完毕,可以使用方法get_recore()得到检索的结果。 widget.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #ifndef WIDGET_H #define WIDGET_H #include #include #include #include %using namespace std; //fields string file_name; //日志文件名 string kw_contains; //日志过滤条件中,需要包含的关键字 string kw_not_contains; //日志过滤条件中,不需要包含的关键字 int file_num; //指定目录下,特定文件的个数 GtkWidget* window; //主界面窗口 GtkWidget* lbl_file_num; //文件个数标签 GtkWidget* btn_choose_file; //选择文件按钮 GtkWidget* btn_view; //查看日志文件按钮 GtkWidget* ety_contains; //包含关键字输入文本框 GtkWidget* ety_not_contains; //不包含关键字输入文本框 GtkWidget* scroll_win; //用于显示日志的滚动窗口 GtkWidget* text; //显示日志多行文本框 GtkWidget* table; //用于摆放界面控件的表格布局 GtkWidget* dialog; //用于选择文件的对话框

联系合同范文客服:xxxxx#qq.com(#替换为@)