Asciinema:你的全部操做都将被录制

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

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

asciinema的录制和播放都是基于文本的,相比传统的video有不少好处,例如录制文件体积小,在播放的过程当中能够暂停复制其中的文本内容等等python

同时asciinema还提供了一个网站,你若是愿意还能够将录制的内容上传至asciinema.org进行展现,也能够在这里找到不少有趣的终端录像linux

asciinema由如下三个子项目构成:web

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

asciinema的安装和使用都很是简单,一块儿来看看吧浏览器

安装

asciinema为python开发,能够直接经过apt-getyum或者pip进行安装bash

# apt-get install asciinema
复制代码

安装完成后查看版本服务器

# asciinema --version
asciinema 2.0.2
复制代码

asciinema有v1和v2两个版本,差别较大,咖啡君使用了v2,如下全部内容也基于v2演示app

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

录制

# 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还能够记录执行的结果,怎么样,是否是很方便,赶忙试试吧


扫码关注公众号查看更多实用文章

相关文章推荐阅读:

相关文章
相关标签/搜索