主机管理+堡垒机系统开发:strace命令及日志解析(五)
一、strace命令简介
测试命令截图

第一个窗口执行命令如下
[root@elk ~]# w
16:51:56 up 3 days, 6:01, 3 users, load average: 0.04, 0.07, 0.11
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.118.83 10:38 6:09m 0.05s 0.05s -bash
root pts/1 192.168.118.30 11:45 4.00s 0.11s 0.10s -bash
root pts/2 192.168.118.30 16:41 3:24 0.05s 0.05s -bash
[root@elk ~]# ps -ef|grep ssh
root 875 1 0 8月10 ? 00:00:00 /usr/sbin/sshd -D
root 7191 875 0 16:41 ? 00:00:00 sshd: root@pts/2
root 7507 24446 0 16:47 pts/1 00:00:00 grep --color=auto ssh
root 20957 875 0 10:38 ? 00:00:00 sshd: root@pts/0
root 24444 875 0 11:45 ? 00:00:00 sshd: root@pts/1
[root@elk ~]# strace -f -p 24444 -t -o trace.log
strace: Process 24444 attached
第二个窗口操作
[root@elk conf]# cd
[root@elk ~]# ll
总用量 8
-rw-------. 1 root root 1002 8月 2 17:18 anaconda-ks.cfg
-rw-r--r-- 1 root root 842 8月 13 16:47 trace.log
[root@elk ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd
tcp6 0 0 :::4002 :::* LISTEN 14808/java
tcp6 0 0 :::4102 :::* LISTEN 14808/java
tcp6 0 0 :::9200 :::* LISTEN 5207/java
tcp6 0 0 :::9300 :::* LISTEN 5207/java
tcp6 0 0 :::22 :::* LISTEN 875/sshd
tcp6 0 0 :::8090 :::* LISTEN 14808/java
udp 0 0 0.0.0.0:68 0.0.0.0:* 819/dhclient
[root@elk ~]# top
top - 16:47:37 up 3 days, 5:57, 3 users, load average: 0.06, 0.08, 0.12
Tasks: 101 total, 2 running, 99 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.9 us, 5.9 sy, 0.0 ni, 88.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 18136232 total, 14974344 free, 1835300 used, 1326588 buff/cache
KiB Swap: 8388604 total, 8388604 free, 0 used. 15926016 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 51616 3760 2568 S 0.0 0.0 1:01.66 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:02.01 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:17.93 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:02.32 watchdog/0
[root@elk ~]# ll
总用量 8
-rw-------. 1 root root 1002 8月 2 17:18 anaconda-ks.cfg
-rw-r--r-- 1 root root 842 8月 13 16:47 trace.log
[root@elk ~]# cd /usr/local/
[root@elk local]# ll
总用量 4
drwxr-xr-x. 2 root root 6 4月 11 12:59 bin
drwxr-xr-x 15 root root 154 8月 13 11:53 ccb-client
drwxr-xr-x. 2 root root 6 4月 11 12:59 etc
drwxr-xr-x. 2 root root 6 4月 11 12:59 games
drwxr-xr-x. 2 root root 6 4月 11 12:59 include
drwxr-xr-x 8 10 143 4096 3月 21 2016 jdk1.8.0_77
drwxr-xr-x. 2 root root 6 4月 11 12:59 lib
drwxr-xr-x. 2 root root 6 4月 11 12:59 lib64
drwxr-xr-x. 2 root root 6 4月 11 12:59 libexec
drwxr-xr-x. 2 root root 6 4月 11 12:59 sbin
drwxr-xr-x. 5 root root 46 4月 11 12:59 share
drwxr-xr-x. 2 root root 51 8月 2 17:28 src
[root@elk local]# cd ..
[root@elk usr]# vim /etc/hosts
日志跟踪文件trace.log
[root@elk ~]# cat trace.log
24444 16:47:21 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
24444 16:47:21 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
24444 16:47:21 clock_gettime(CLOCK_BOOTTIME, {280620, 614943888}) = 0
24444 16:47:21 read(12, "strace: Process 24444 attached\r\n", 16384) = 32
24444 16:47:21 clock_gettime(CLOCK_BOOTTIME, {280620, 615243828}) = 0
24444 16:47:21 select(13, [3 5 12], [3], NULL, NULL) = 1 (out [3])
24444 16:47:21 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
24444 16:47:21 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
24444 16:47:21 clock_gettime(CLOCK_BOOTTIME, {280620, 615599914}) = 0
24444 16:47:21 write(3, "\0\0\0000\237h\n^\203\203\210\363\233\250T:\243\314\303\212a\\\214\264\274q\332\314\347h\v&"..., 84) = 84
24444 16:47:21 clock_gettime(CLOCK_BOOTTIME, {280620, 615804167}) = 0
24444 16:47:21 select(13, [3 5 12], [], NULL, NULL) = 1 (in [3])
24444 16:48:11 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
24444 16:48:11 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
24444 16:48:11 clock_gettime(CLOCK_BOOTTIME, {280671, 239232964}) = 0
24444 16:48:11 read(3, "\0\0\0\20\256\365;\234\241\327\376A\265M!\311\257p\304\257\34\301\262\376\222\231\241\1774(\353\347"..., 16384) = 52
24444 16:48:11 clock_gettime(CLOCK_BOOTTIME, {280671, 239559322}) = 0
24444 16:48:11 select(13, [3 5 12], [], NULL, NULL) = 1 (in [3])
24444 16:49:12 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
24444 16:49:12 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
24444 16:49:12 clock_gettime(CLOCK_BOOTTIME, {280731, 254936108}) = 0
24444 16:49:12 read(3, "\0\0\0\20\177jU\316\211!5\256\305F\236\4g\16\317\237\302\234\333D\337v\365\3020W\311|"..., 16384) = 52
24444 16:49:12 clock_gettime(CLOCK_BOOTTIME, {280731, 255319942}) = 0
24444 16:49:12 select(13, [3 5 12], [], NULL, NULL) = 1 (in [3])
24444 16:50:12 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
24444 16:50:12 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
24444 16:50:12 clock_gettime(CLOCK_BOOTTIME, {280791, 266306720}) = 0
24444 16:50:12 read(3, "\0\0\0\20\203\372\262\354\\\263\322$\242\266\6`\347\271\27\254\224\261i3\250\212\33R\371\"\"\242"..., 16384) = 52
24444 16:50:12 clock_gettime(CLOCK_BOOTTIME, {280791, 266653313}) = 0
24444 16:50:12 select(13, [3 5 12], [], NULL, NULL) = 1 (in [3])
24444 16:51:12 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
24444 16:51:12 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
24444 16:51:12 clock_gettime(CLOCK_BOOTTIME, {280851, 280884675}) = 0
24444 16:51:12 read(3, "\0\0\0\20R\260XK\253\233\3\31\321\223\265w\275\335\366\t\277\f\3574\v:\227\276\360s\336K"..., 16384) = 52
24444 16:51:12 clock_gettime(CLOCK_BOOTTIME, {280851, 281262652}) = 0
24444 16:51:12 select(13, [3 5 12], [], NULL, NULL) = 1 (in [3])
24444 16:51:53 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
24444 16:51:53 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
24444 16:51:53 clock_gettime(CLOCK_BOOTTIME, {280892, 379224898}) = 0
24444 16:51:53 read(3, "\0\0\0\20\303c\231;\233\2427\273\31\260\277\33\350@\250\3n\344vT\241\351\276\347x\304\363\233"..., 16384) = 52
24444 16:51:53 clock_gettime(CLOCK_BOOTTIME, {280892, 379519032}) = 0
24444 16:51:53 select(13, [3 5 12], [8], NULL, NULL) = 1 (out [8])
24444 16:51:53 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
24444 16:51:53 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
24444 16:51:53 clock_gettime(CLOCK_BOOTTIME, {280892, 379862413}) = 0
24444 16:51:53 write(8, "\3", 1 <detached ...>
过滤后的是都是什么东东呀?
[root@elk ~]# cat trace.log |grep 'write(3'
24444 16:47:21 write(3, "\0\0\0000\237h\n^\203\203\210\363\233\250T:\243\314\303\212a\\\214\264\274q\332\314\347h\v&"..., 84) = 84
[root@elk ~]# cat trace.log |grep 'read(3'
24444 16:48:11 read(3, "\0\0\0\20\256\365;\234\241\327\376A\265M!\311\257p\304\257\34\301\262\376\222\231\241\1774(\353\347"..., 16384) = 52
24444 16:49:12 read(3, "\0\0\0\20\177jU\316\211!5\256\305F\236\4g\16\317\237\302\234\333D\337v\365\3020W\311|"..., 16384) = 52
24444 16:50:12 read(3, "\0\0\0\20\203\372\262\354\\\263\322$\242\266\6`\347\271\27\254\224\261i3\250\212\33R\371\"\"\242"..., 16384) = 52
24444 16:51:12 read(3, "\0\0\0\20R\260XK\253\233\3\31\321\223\265w\275\335\366\t\277\f\3574\v:\227\276\360s\336K"..., 16384) = 52
24444 16:51:53 read(3, "\0\0\0\20\303c\231;\233\2427\273\31\260\277\33\350@\250\3n\344vT\241\351\276\347x\304\363\233"..., 16384) = 52
二、目录结构

三、实现代码
1、日志解析
import re class AuditLogHandler(object):
'''分析audit log日志''' def __init__(self,log_file):
self.log_file_obj = self._get_file(log_file) def _get_file(self,log_file): return open(log_file) def parse(self):
cmd_list = []
cmd_str = ''
catch_write5_flag = False #for tab complication
for line in self.log_file_obj:
#print(line.split())
line = line.split()
try:
pid,time_clock,io_call,char = line[0:4]
if io_call.startswith('read(4'):
if char == '"\\177",':#回退
char = '[1<-del]'
if char == '"\\33OB",': #vim中下箭头
char = '[down 1]'
if char == '"\\33OA",': #vim中下箭头
char = '[up 1]'
if char == '"\\33OC",': #vim中右移
char = '[->1]'
if char == '"\\33OD",': #vim中左移
char = '[1<-]'
if char == '"\33[2;2R",': #进入vim模式
continue
if char == '"\\33[>1;95;0c",': # 进入vim模式
char = '[----enter vim mode-----]' if char == '"\\33[A",': #命令行向上箭头
char = '[up 1]'
catch_write5_flag = True #取到向上按键拿到的历史命令
if char == '"\\33[B",': # 命令行向上箭头
char = '[down 1]'
catch_write5_flag = True # 取到向下按键拿到的历史命令
if char == '"\\33[C",': # 命令行向右移动1位
char = '[->1]'
if char == '"\\33[D",': # 命令行向左移动1位
char = '[1<-]' cmd_str += char.strip('"",')
if char == '"\\t",':
catch_write5_flag = True
continue
if char == '"\\r",':
cmd_list.append([time_clock,cmd_str])
cmd_str = '' # 重置
if char == '"':#space
cmd_str += ' ' if catch_write5_flag: #to catch tab completion
if io_call.startswith('write(5'):
if io_call == '"\7",': #空键,不是空格,是回退不了就是这个键
pass
else:
cmd_str += char.strip('"",')
catch_write5_flag = False
except ValueError as e:
print("\033[031;1mSession log record err,please contact your IT admin,\033[0m",e) #print(cmd_list)
# for cmd in cmd_list:
# print(cmd)
return cmd_list
if __name__ == "__main__":
parser = AuditLogHandler('tmp/ssh_log2_4')
parser.parse()
2、拿不到pid的解决方案
#!/bin/bash ssh_tag=$1 echo "----$ssh_tag---" for i in $(seq 1 30);do
process_id=$(ps -ef |grep $ssh_tag|grep -v sshpass |grep -v grep |grep -v $0 | awk '{ print $2 }' )
echo "---process id: $process_id ---"
if [ ! -z $process_id ];then echo 'running str4ack'
log_path=/home/traum/CrazyEye/log/`date +%F`
mkdir -p $log_path
sudo strace -fp $process_id -t -o $log_path/session_$2.log
break;
fi;
sleep 1;
done;
3、规范日志存储
class Session(models.Model):
'''生成用户操作session id '''
user = models.ForeignKey('UserProfile')
bind_host = models.ForeignKey('BindHost')
tag = models.CharField(max_length=128,default='n/a')
closed = models.BooleanField(default=False)
cmd_count = models.IntegerField(default=0) #命令执行数量
stay_time = models.IntegerField(default=0, help_text="每次刷新自动计算停留时间",verbose_name="停留时长(seconds)")
date = models.DateTimeField(auto_now_add=True) def __str__(self):
return '<id:%s user:%s bind_host:%s>' % (self.id,self.user.email,self.bind_host.host)
class Meta:
verbose_name = '审计日志'
verbose_name_plural = '审计日志'
主机管理+堡垒机系统开发:strace命令及日志解析(五)的更多相关文章
- python 之路,Day27 - 主机管理+堡垒机系统开发
python 之路,Day27 - 主机管理+堡垒机系统开发 本节内容 需求讨论 构架设计 表结构设计 程序开发 1.需求讨论 实现对用户的权限管理,能访问哪些机器,在被访问的机器上有哪些权限 实 ...
- 主机管理+堡垒机系统开发:strace工具的实现原理(七)
strace是Linux系统下的一个用来跟踪系统调用的工具,它的实现基础是ptrace系统调用.使用strace工具可以跟踪一个程序执行过程中发生的系统调用. 我这里讲到的内容有一点点和mips体系相 ...
- 主机管理+堡垒机系统开发:webssh(十)
一.安装shellinabox 1.安装依赖工具 yum install git openssl-devel pam-devel zlib-devel autoconf automake libtoo ...
- 主机管理+堡垒机系统开发:strace命令用法详解(六)
一.简单介绍 strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进 ...
- day28 CRM万能权限组件开发 && 主机管理-堡垒机
1,CRM项目实战-万能权限组件开发参考博客:http://www.cnblogs.com/alex3714/articles/6661911.html 参考代码:https://github.com ...
- day29 主机管理-堡垒机2-原生ssh会话记录
day29课堂代码:https://github.com/liyongsan/git_class/tree/master/day29 课堂笔记: 通过原生Ssh 记录会话1. 在我们自己的堡垒机交互脚 ...
- day30 主机管理-堡垒机3-操作记录
课堂代码:https://github.com/liyongsan/git_class/tree/master/day30
- 简单易用的堡垒机系统—Teleport
简单易用的堡垒机系统-Teleport 官方文档:http://teleport.eomsoft.net/doc#!1 一.Teleport介绍 Teleport是触维软件推出的一款简单易用的堡垒机 ...
- 审计系统---堡垒机项目之用户交互+session日志写入数据库[完整版]
2018-06-20 时隔一个多月,忘记了之前的所有操作,重拾起来还是听不容易的,想过放弃,但还是想坚持一下,加油. 世界杯今天葡萄牙1:0战胜摩洛哥,C 罗的一个头球拯救了时间,目前有4个射球,居2 ...
随机推荐
- java-----理解java的三大特性之多态
的java提高篇(四)-----理解的java的三大特性之多态 面向对象编程有三大特性:封装,继承,多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外 ...
- Bootstrap -- 插件: 模态框、滚动监听、标签页
Bootstrap -- 插件: 模态框.滚动监听.标签页 1. 模态框(Modal): 覆盖在父窗体上的子窗体. 使用模态框: <!DOCTYPE html> <html> ...
- kernel笔记——定时器与时间管理
内核中时钟主要完成以下作用: 记录系统运行时间 完成时间相关的统计功能,如cpu占用率等 定时功能,设定某个进程一段时间后完成某项任务 为实现以上功能,硬件以及内核提供了不同类型的时钟. RTC 实时 ...
- linux vi粘贴格式易错乱
对于一些冗长的代码完全可以粘贴的时候,vi粘贴所有格式全部错乱,完全无法阅读. 解决办法:esc进入命令行模式后,输入 :set paste,然后再i进入粘贴编辑模式,即可正常复制并保留原有格式-
- MySQL之库相关操作
一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...
- Linux-基础学习(四)-部署图书管理系统项目
部署图书管理项目需要以下软件 项目文件(django项目文件夹) 数据库文件(django项目对应的数据库文件) centos7(linux本体) nginx(反向代理以及静态文件收集) uWSGI( ...
- STM32F40G-EVAL_UC/OS III
micrum官网下载uc/os程序包: 包含文件cotex_M4.h:
- 【Topcoder 8572】TheLuckySum
题意:给一个数\(n\),要把它分成lucky numbers的和. 问个数最少.字典序最小的方案. 思路:果断搜索.个数最少,所以迭代加深.枚举要的个数\(m\). 首先我们看\(n\)的个位.它肯 ...
- 在Bootstrap开发框架中使用bootstrapTable表格插件和jstree树形列表插件时候,对树列表条件和查询条件的处理
在我Boostrap框架中,很多地方需要使用bootstrapTable表格插件和jstree树形列表插件来共同构建一个比较常见的查询界面,bootstrapTable表格插件主要用来实现数据的分页和 ...
- 分享Winform datagridview 动态生成中文HeaderText
缘起 很久以前给datagridview绑定列的时候都是手动的,记得以前用Display自定义属性来动态给datagridview绑定列.后来发现不行,于是还在博问发了问题: 后来热心网友帮我回答了这 ...