Asciinema:你的所有操作都將被錄製
如何實現類似於Jumpserver koko一樣的終端錄製回放功能呢?本文介紹一個神器
asciinema 是一款開源免費的終端錄製工具,它可以將命令列輸入輸出的任何內容加上時間儲存在檔案中,同時還提供方法在終端或者web瀏覽器中進行回放
asciinema的錄製和播放都是基於文字的,相比傳統的video有很多好處,例如錄製檔案體積小,在播放的過程中可以暫停複製其中的文字內容等等
同時asciinema還提供了一個網站,你如果願意還可以將錄製的內容上傳至asciinema.org進行展示,也可以在這裡找到很多有趣的終端錄影
asciinema由以下三個子專案構成:
- asciinema:基於命令列的終端會話記錄器
- asciinema.org:提供API供上傳錄影和展示的網站
- javascript player:用於在web上播放錄影的js播放器
asciinema的安裝和使用都非常簡單,一起來看看吧
安裝
asciinema為python開發,可以直接通過apt-get
、yum
或者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
,本文主要說明rec
和play
的使用
錄製
# 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還可以記錄執行的結果,怎麼樣,是不是很方便,趕緊試試吧
相關文章推薦閱讀:
- Django實現WebSSH操作Kubernetes Pod
- Django實現WebSSH操作物理機或虛擬機器