如何实现类似于Jumpserver koko一样的终端录制回放功能呢?本文介绍一个神器

asciinema 是一款开源免费的终端录制工具,它可以将命令行输入输出的任何内容加上时间保存在文件中,同时还提供方法在终端或者web浏览器中进行回放

asciinema的录制和播放都是基于文本的,相比传统的video有很多好处,例如录制文件体积小,在播放的过程中可以暂停复制其中的文本内容等等

同时asciinema还提供了一个网站,你如果愿意还可以将录制的内容上传至asciinema.org进行展示,也可以在这里找到很多有趣的终端录像

asciinema由以下三个子项目构成:

  1. asciinema:基于命令行的终端会话记录器
  2. asciinema.org:提供API供上传录像和展示的网站
  3. javascript player:用于在web上播放录像的js播放器

asciinema的安装和使用都非常简单,一起来看看吧

安装

asciinema为python开发,可以直接通过apt-getyum或者pip进行安装

# apt-get install asciinema

安装完成后查看版本

# asciinema --version
asciinema 2.0.2

asciinema有v1和v2两个版本,差异较大,咖啡君使用了v2,以下所有内容也基于v2演示

asciinema有5个参数,分别为录制:rec,播放:play,以文件形式查看录制内容:cat,上传文件到asciinema.org网站:upload、asciinema.org账号认证:auth,本文主要说明recplay的使用

录制

# asciinema rec ops-coffee.cast

有几个参数可以使用:

--stdin 表示启用标准输入录制,意思是通常情况下linux输入密码类的信息都不会显示,如果开启了这个选项,可以记录键盘输出的密码,但这个功能官方似乎还没有支持,加了后看不到效果

--append 添加录制到已存在的文件中

--raw 保存原始STDOUT输出,无需定时信息等

--overwrite 如果文件已存在,则覆盖

-c 要记录的命令,默认为$SHELL

-e 要捕获的环境变量列表,默认为SHELL,TERM

-t 后跟数字,指定录像的title

-i 后跟数字,设置录制时记录的最大空闲时间

-y 所有提示都输入yes

-q 静默模式,加了此参数在进入录制或者退出录制时都没有提示

输入exit或按ctrl+D组合键退出录制

播放

# asciinema play ops-coffee.cast

有两个参数可以使用:

-s 后边跟数字,表示用几倍的速度来播放录像

-i 后边跟数字,表示在播放录像时空闲时间的最大秒数

在播放的过程中你可以通过空格来控制暂停或播放,也可以通过ctrl+c组合键来退出播放,当你按空格键暂停时,可以通过.号来逐帧显示接下来要播放的内容

文件

asciinema推荐的文件后缀是.cast,当然linux是不关心文件后缀的,你用什么都可以,推荐按规范使用.cast,文件内容大概如下

# cat ops-coffee.cast
{"version": 2, "width": 237, "height": 55, "timestamp": 1572646909, "env": {"SHELL": "/bin/bash", "TERM": "linux"}, "title": "ops-coffee"}
[0.010014, "o", "root@onlinegame:~# "]
[1.296458, "o", "exit"]
[1.976439, "o", "\r\n"]
[1.976532, "o", "exit\r\n"]

cast文件主要有两部分组成,位于第一行的一个字典,这里叫header

{
"version": 2,
"width": 237,
"height": 55,
"timestamp": 1572646909,
"env": {
"SHELL": "/bin/bash",
"TERM": "linux"
},
"title": "ops-coffee"
}

header很简单,字段的意思分别为:version版本,width和height分别表示录制窗口的宽高,timestamp录制开始的时间戳,env录制时指定的-e参数设置,title录制时指定的-t参数设置

接下来的都是固定格式的内容,实际上就是IO流信息

[0.010014, "o", "root@onlinegame:~# "]

每一行都是由三部分组成的一个列表

第一部分为一个浮点数,表示输入输出这一行内容所花的时间

第二部分似乎是一个固定的字符串,没有找到说明做什么用的

第三部分就是具体的输入输出的内容

这个文件格式设计还是非常优雅的,开头header声明,后边具体内容,如果中途因为任何意外导致录像终止,也不会丢失整个录像,而且还可以append增加录像,这在需要长时间暂停录制时非常有用,更重要的是可以流式读取,几乎很少占用内存,不需要把整个录像文件都放在内存中,对长时间的录制播放更友好

自动录制审计日志

如果你有经历过严格的IT审计,或者有用到堡垒机,就会知道操作过程是需要记录并加入审计的,如果你有因为不知道是谁操作了什么导致了数据被删而背锅的经历,就会知道对操作过程的记录有多么的重要,接下来以一个简单的案例来介绍asciinema有什么样的实用价值

如果希望能够将linux服务器上devuser的所有操作过程都记录下来,以备后续审计使用,该如何实现呢?

非常简单,只需要在devuser用户的家目录下添加.bash_profile文件即可,内容如下:

$ cat ~/.bash_profile
export LC_ALL=en_US.UTF-8
/usr/local/bin/asciinema rec /tmp/$USER-$(date +%Y%m%d%H%M%S).log -q

添加export LC_ALL=en_US.UTF-8的原因是有可能系统会报错asciinema needs a UTF-8 native locale to run. Check the output of locale command.

rec命令进行录制时添加了-q参数,这样在进入或者退出时都不会有任何关于asciinema的提示,使用简单方便

这样devuser用户每次登陆就会自动开启一个录像,如果需要审计或检查操作,只需要回放录像就可以了

你可能会说history命令一样可以记录用户操作,asciinema有什么优势呢?asciinema不仅可以记录用户的输入,还可以记录系统的输出,也就是说history只能记录执行的命令,而asciinema还可以记录执行的结果,怎么样,是不是很方便,赶紧试试吧


相关文章推荐阅读:

Asciinema:你的所有操作都将被录制的更多相关文章

  1. ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象

    http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value   (存一个对象的时候key存) 将哈希 ...

  2. (原)java 向上转型中,任何域的访问操作都是由编译器解析,不是多态

    最近在向java发力,学习学习了下.看到了多态这一节,书中有个比较好的例子,所以就准备写下来,记录下来: package dynamic_binding01; public class dynamic ...

  3. 获取器操作都是针对数据而不是数据集的,要通过append()方法添加数据表不存在的字段

    获取器操作都是针对数据而不是数据集的,要通过append()方法添加数据表不存在的字段 public function getMembership(){ //加入会员s_id = 1 $busines ...

  4. beego orm操蛋问题:操作都需要主键

    查看bee generate appcode自动生成的代码,会发现orm操作都是以主键为依据的. 如果我不想根据主键怎么操作?用 ORM.Raw(cmd).Exec()吧,cmd=[你的mysql语句 ...

  5. html dom与javascript的关系 -我们用JavaScript对网页(HTML)进行的所有操作都是通过DOM进行的

    一,什么是DOM (参考源http://www.cnblogs.com/chaogex/p/3959723.html) DOM是什么 DOM全称为The Document Object Model,应 ...

  6. Redis hash 是一个 string 类型的 field 和 value 的映射表.它的添加、删除操作都是 O(1)(平均)。

    2.3 hashes 类型及操作 Redis hash 是一个 string 类型的 field 和 value 的映射表.它的添加.删除操作都是 O(1)(平均).hash 特别适合用于存储对象.相 ...

  7. (代替人类)很多操作都在Settings里面。 5.安装第三方库

    2020-02-01 pycharm 使用教程 LingSmart关注 0.0842020.02.07 15:08:50字数 1,394阅读 680 实在无聊,就来学习吧.学习pycharm的使用教程 ...

  8. php中的正则函数:正则匹配,正则替换,正则分割 所有的操作都不会影响原来的字符串.

    有一个长期的误解, 如果要分组, 必须用 小括号 和 |, 而不能用 中括号 和 |. [ab|AB]表示的不是 匹配 ab或 AB, 而是表示 匹配 a,b, |, A, B 这5个字符中 的任意 ...

  9. 一切的浮点型进行计算操作都要用BigDecimal

    简化: 1.引言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确 ...

随机推荐

  1. Python+Django+ansible playbook自动化运维项目实战☝☝☝

    Python+Django+ansible playbook自动化运维项目实战☝☝☝  一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...

  2. PHP array_mulitsort

    1.函数的作用:对多维数组进行排序 2.函数的例子: 例子一: <?php // http://php.net/manual/zh/function.array-multisort.php $m ...

  3. 从前端到全栈:JavaScript逆袭之路

    JavaScript如何做到上天入地无所不能?JavaScript真的能一统江湖吗? 背景 近年来,前端技术日新月异,前端已经不仅仅是网页,更多的开始由狭义向广义发展. 先后涌现出了具备后端能力的no ...

  4. CSP-S 初赛内容整理

    图灵奖 艾伦·麦席森·图灵(Alan Mathison Turing,1912-1954)1966 共计70名科学家获此殊荣,华人仅有1位,他是2000年姚期智. 解释型语言 Python / Jav ...

  5. Spring Boot2 系列教程(十五)定义系统启动任务的两种方式

    在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( ...

  6. MOOC python笔记(三) 序列容器:字符串、列表、元组

    容器概念 容器是Python中的重要概念,分为有序与无序. 有序容器也称为序列类型容器,如:字符串.列表. 通用序列容器操作 容器连接+ 加号可以把两个序列连接成一个更大的容器,相加后两个序列的值并不 ...

  7. qt实现串口通讯

    摘要:上位机软件程序通过QT实现,采集输入信息,根据实际需要做出合适的串口通讯协议,实现效果如下图所示: 主要实现的功能: 1.串口基本参数可选,可调 2.显示区域可选择十六进制/asicii码显示, ...

  8. jenkins pipeline 流水线生产

    jenkins pipeline : pipeline { agent any parameters { string(name: 'git_version', defaultValue: 'v1.1 ...

  9. python学习-while True语句

    while True是不会跳出循环的. 在while中括号里为一个条件值,只有当条件为真的时候,会执行这条语句,直到条件为false的时候,则会跳出该循环语句.而在这里括号里的值为true,也就意味着 ...

  10. JS移动端适配(自适应)

    var html = document.querySelector('html'); changeRem(); window.addEventListener('resize', changeRem) ...