1. 程式人生 > >Asciinema:你的所有操作都將被錄製

Asciinema:你的所有操作都將被錄製

如何實現類似於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還可以記錄執行的結果,怎麼樣,是不是很方便,趕緊試試吧


相關文章推薦閱讀: