如何实现类似Jumpserverkoko的终端录音播放功能?本文介绍一个神器。asciinema是一款开源免费的终端录制工具,可以将命令行输入输出的任何内容加上时间保存在一个文件中,同时也提供了在终端或者浏览器中回放的方法。asciinema的录制和播放都是基于文本的,相对于传统视频有很多优势,比如录制的文件体积小,播放时可以暂停和复制文本内容等等。同时,asciinema还提供了网站。如果你愿意,你可以将录制的内容上传到asciinema.org进行展示,你也可以在这里找到很多有趣的终端视频。asciinema由以下三个子项目组成:asciinema:基于命令行的终端会话记录器asciinema.org:提供用于上传和显示视频的API的网站javascriptplayer:用于在网络上播放视频的js播放器安装和asciinema的使用都非常简单,一起来看看吧。安装asciinema是为python开发的。可以直接通过apt-get、yum或pip安装#apt-getinstallasciinema安装完成后查看版本#asciinema--versionasciinema2.0.2asciinema有两个v1和v2,版本差别较大。咖啡君使用的是v2,以下所有内容也都是基于v2的demo。asciinema有5个参数,录音:rec,播放:play,查看录制内容为文件:cat,上传文件到asciinema.org网站:upload,asciinema.org账号认证:auth,本文主要讲解rec和asciinema.org的功能玩用。录音#asciinemarecops-coffee.cast有几个参数可以使用:--stdin表示开启标准输入录音,也就是说一般情况下,linux输入密码等信息是不会显示的。如果开启这个选项,键盘输出可以记录密码,不过官方好像不支持这个功能,加了之后看不到效果。--append添加记录到现有文件。--raw保存原始STDOUT输出,不带计时信息等。--overwrite如果文件已经存在则覆盖它。-c命令记录,默认为$SHELL。-e要捕获的环境变量列表,默认为SHELL、TERM。-t后跟数字指定录音的标题。-i后跟一个数字,设置记录时记录的最大空闲时间。-y全部提示进入yes-q静默模式,加入这个参数在进入或退出录音时都不会提示。输入exit或按ctrl+D退出录制。播放#asciinemaplayops-coffee.cast有两个参数可以使用:-s后面跟一个数字,表示用多少次速度播放视频-i后面跟一个数字,表示空闲的最大秒数播放时的time中,可以使用空格控制暂停或播放,也可以使用ctrl+c组合键退出播放。当您按空格键暂停时,您可以使用.标志逐帧显示下一播放内容。推荐的asciinema文件后缀是.cast。当然,Linux并不关心文件后缀。你可以使用任何你想要的。建议按照规范使用.cast。文件内容大致如下#catops-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参数设置,以及标题录制期间指定的-t参数设置。下面是固定格式的内容,其实就是IO流信息[0.010014,"o","root@onlinegame:~#"]每一行都是一个列表,由三部分组成。第一部分是浮点数。表示输入和输出该行内容所花费的时间。第二部分好像是一个固定的字符串,第三部分是具体的输入输出内容。开头的header语句,后面具体内容,如果中间发生意外终止录音,不会丢失整个录音,还可以append增加录音,录音的时候很有用需要长时间停顿,更重要的是可以串流读取,几乎不会占用内存,也不需要把整个视频文件都放在内存中,对长时间录制更友好回放。自动记录审计日志如果你经历过严格的IT审计,或者使用过堡垒机,你就会知道操作过程需要被记录下来并加入到审计中。如果你不知道是谁操作了什么导致数据被删除,在经历过背锅后,你就会知道记录操作过程是多么的重要。下面通过一个简单的案例来介绍asciinema的实用价值。很简单,在devuser用户的家目录下添加.bash_profile文件即可,内容如下:$cat~/.bash_profileexportLC_ALL=en_US.UTF-8/usr/local/bin/asciinemarec/tmp/$USER-$(date+%Y%m%d%H%M%S).log-q加上exportLC_ALL=en_US.UTF-8的原因是系统可能会报错:asciinemaneedsaUTF-8nativelocaletorun.Checktheoutputoflocalecommand.reccommand增加了-q参数,这样进入退出时就不会出现关于asciinema的提示,使用起来简单方便。这样,每次devuser用户登录,都会自动打开一条录音。如果需要审计或检查操作,只需要回放录音即可。你可能会说history命令也可以记录用户的操作。asciinema有什么优势?Asciinema不仅可以记录用户输入,还可以记录系统输出。也就是说history只能记录执行过的命令,而asciinema还可以记录执行结果,怎么样,是不是很方便,赶紧试试吧。
