前言:

asciinema这个录屏软件前面有一点研究,但它的部署安装比较麻烦,虽然此软件的安装部署方式是很多的,比如yum安,apt,brew,docker,pip,rust编译,docker等等,但唯独缺少二进制的安装方式。


究其原因,可能是因为该软件的设计初衷是希望各位用户将自己的录屏内容联网发送到官网,想做成一个互联网的产品吧。

总的来说,部署asciinema基本是需要Python3的环境,而Python在linux内是一个非常重要的依赖,比如,yum命令依赖于Python2.7 而这样严苛的部署依赖是影响此软件的推广使用的

因此,这几天研究了一下asciinema的部署,发现rust编译后产生的asciinema可以以一个二进制形式的程序运行,虽然该二进制的asciinema运行仍然需要高版本的glibc作为依赖,但已经在可接受的范围内了;这大大提高了asciinema的易用性,并且该软件的录制效果非常好,长时间运行录屏的录像产物磁盘空间占用并不高,并且可以在播放的时候调节播放速度,这些都是非常nice的地方。

那么,此软件配合shell脚本或者开发框架可以做到运维审计功能;其次还有asciinema2gif这个软件,此软件可以将asciinema生成的录屏文件转换成GIF格式,使得播放不在是一个让人困扰的问题(asciinema生成的录屏文件必须使用asciinema才可以播放,比较的让人烦躁,不是吗?)

下面将就asciinema的编译和利用编译出来的可执行文件做到在其它的服务器上免编译,随时随地使用做一个尽量详尽的介绍

一,

asciinema的编译

这个软件的编译比较特别,需要使用rust编译器来进行编译,全程基本都是需要联网操作,对网速的要求是比较高的

asciinema编译安装包的下载地址:https://codeload.github.com/asciinema/asciinema/zip/refs/heads/develop

rust编译环境安装部署好后,将asciinema也上传到服务器上,任意路径,解压后,进入解压目录,执行编译即可:

cd asciinema
cargo build --release

注意,这个是比较慢的,基本所有的依赖包什么的都是从国外的网站自动下载,非常耗时和考验网速

编译完成后,可以看到asciinema的源码包内文件如下:

[root@node2 asciinema-develop]# ls -alh
total 160K
drwxr-xr-x  9 root root  306 Feb 20 23:39 .
dr-xr-x---. 9 root root 4.0K Feb 23 05:57 ..
drwxr-xr-x  2 root root   83 Feb 20 17:42 assets
drwxr-xr-x  2 root root   25 Feb 20 17:42 .cargo
-rw-r--r--  1 root root  70K Feb 20 17:42 Cargo.lock
-rw-r--r--  1 root root 1.5K Feb 20 17:42 Cargo.toml
-rw-r--r--  1 root root 9.8K Feb 20 17:42 CHANGELOG.md
-rw-r--r--  1 root root 3.2K Feb 20 17:42 CODE_OF_CONDUCT.md
-rw-r--r--  1 root root 3.8K Feb 20 17:42 CONTRIBUTING.md
drwxr-xr-x  2 root root   52 Feb 20 17:42 doc
-rw-r--r--  1 root root  586 Feb 20 17:42 Dockerfile
-rw-r--r--  1 root root 1.5K Feb 20 17:42 flake.lock
-rw-r--r--  1 root root  603 Feb 20 17:42 flake.nix
drwxr-xr-x  4 root root   67 Feb 20 17:42 .github
-rw-r--r--  1 root root   23 Feb 20 17:42 .gitignore
-rw-r--r--  1 root root  35K Feb 20 17:42 LICENSE
-rw-r--r--  1 root root 4.2K Feb 20 17:42 README.md
drwxr-xr-x  6 root root  262 Feb 20 17:42 src
drwxr-xr-x  3 root root   65 Feb 20 23:40 target
drwxr-xr-x  4 root root   74 Feb 20 17:42 tests

asciinema的可执行二进制文件在target/release目录下,算是动态编译了,进一步查看asciinema的运行依赖库,可以看到是有依赖glibc-2.18的,也就是说缺少这个依赖库:

[root@node2 asciinema-develop]# ls -alh target/release/asciinema
-rwxr-xr-x 2 root root 21M Feb 20 23:40 target/release/asciinema
[root@node2 asciinema-develop]# file !$
file target/release/asciinema
target/release/asciinema: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), BuildID[sha1]=0a4b2f36c547e6e6729353a449deda469e7233e5, for GNU/Linux 2.6.32, not stripped

[root@node1 ~]# ldd asciinema 
ldd: warning: you do not have execution permission for `./asciinema'
./asciinema: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by ./asciinema)
	linux-vdso.so.1 =>  (0x00007ffcf95ce000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f119e43e000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007f119e23b000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f119e033000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f119de17000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f119db15000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f119d911000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f119d543000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f119f230000)

🆗,现在asciinema这个可执行程序可以拿到任意一台服务器上去使用了,就像一个二进制文件一样的了,只是前提需要有GLIBC_2.18这个依赖库了

因此,需要编译安装一个GLIBC_2.18,下面是编译安装的方法:

curl -O http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
###下载这个安装包后,解压,进入解压目录,直接执行以下命令
mkdir build
cd build
../configure --prefix=/usr
make
make install

说明:

该版本的GLIBC_2.18编译不需要高版本的gcc编译器支持,系统默认的4.8版本gcc就可以了,不会有什么报错,基本一路畅通,如果是GLIBC_2.23,才可能会报错

在centos7.7.1908以及centos7.0  centos7.5都编译通过,这个比较简单,只是编译前别忘了yum install gcc gcc-c++ zlib zlib-devel openssl openssl-devel -y  了

[root@node1 ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
[root@node1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)

编译成功后,该版本的glibc会自动链接好/lib64/libc.so.6 这个文件:

[root@node1 ~]# ls -al /lib64/libc.so.6 
lrwxrwxrwx. 1 root root 12 Jun 18  2023 /lib64/libc.so.6 -> libc-2.18.so

此时asciinema就可以非常方便的使用了!!!! 在任意的centos7服务器上都可以使用,只要有GLIBC_2.23

二、

asciinema的使用

asciinema这个可执行文件移动到系统路径下,比如/usr/local/bin/目录下,可以改名,改成任意的名字都可以,比如,我这里改成了audit这个名字,当然,别忘了给这个可执行文件赋予执行权限

[root@node2 asciinema-develop]# ls -al /usr/local/bin/audit 
-rwxr-xr-x 1 root root 21731640 Feb 22 07:09 /usr/local/bin/audit
[root@node2 asciinema-develop]# file !$
file /usr/local/bin/audit
/usr/local/bin/audit: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), BuildID[sha1]=0a4b2f36c547e6e6729353a449deda469e7233e5, for GNU/Linux 2.6.32, not stripped

1、

基本的录屏

rec + 任意的文件名,我这里用的是3333,可以看到开始录屏了(建议还是起一个有意义的名字,不要像我一样太随便)

[root@node2 ~]# audit rec 3333
::: Recording session started, writing to 3333
::: Press <ctrl+d> or type 'exit' to end

输入CTRL+d 或者exit 退出录屏,观察录屏文件,可以看到该文件是一个文本文件,记录了Linux内的命令行动作:

[root@node2 ~]# file 3333 
3333: ASCII text
[root@node2 ~]# cat 3333 
{"version":2,"width":332,"height":80,"timestamp":1708640677,"env":{"SHELL":"/bin/bash","TERM":"xterm"}}
[0.012133, "o", "\u001b]0;root@node2:~\u0007\u001b[?1034h[root@node2 ~]# "]
[53.375933, "o", "d"]
[53.550371, "o", "d"]
[53.719655, "o", "d"]
[53.877701, "o", "d"]
[54.186268, "o", "\r\n"]
[54.186629, "o", "bash: dddd: command not found\r\n"]
[54.186836, "o", "\u001b]0;root@node2:~\u0007[root@node2 ~]# "]
[55.948774, "o", "exit\r\n"]

2、

静默录屏和追加录屏

这里的静默指的是不提示开始录屏,也就是不显示如下:

::: Recording session started, writing to 3333
::: Press <ctrl+d> or type 'exit' to end

加参数-aq  -a是追加的意思,也就是接着上次的录屏文件继续录制屏幕,-q是静默的意思,以上提示没有

 

[root@node2 ~]# audit rec -aq 3333

3、

播放录屏文件,并提高播放速度:

参数play + -s 任意数字,可以整数也可以小数,这个速度没有上限,随便多少速度都可以,不过我这里100的速度,很快就播放完了

[root@node2 ~]# audit play 3333  -s 100
::: Replaying session from 3333
[root@node2 ~]# dddd
bash: dddd: command not found
[root@node2 ~]# exit
[root@node2 ~]# chmod a+x asciinema 
[root@node2 ~]# exit
::: Playback ended

三、

asciinema的使用范围

可以将该程序写入脚本内,配合脚本就可以自动化的运维审计了,其次,运维的操作分享,比如,某些软件的部署过程,可以分享给同事了,最后,利用asciinema可以生成可可复制文字的GIF图片。