script & scriptreplay

script是什么


scirpt就是一个命令,能够制做一份记录输出到终端的记录。对于那些想要真实记录终端会话的人来讲,这颇有用。该记录能够保存并在之后再打印出来。typescript

怎么用shell

默认状况下,咱们能够经过在终端中输入script来启动scirpt命令。bash

pungki@dev-machine:~$ script
Script started, file is typescript
pungki@dev-machine:~$

你也能够指定目标文件名来记录打印结果。session

pungki@dev-machine:~$ script myfile

当你再次见到命令提示符,这意味着终端将记录打印到终端的任何东西。app

你会看到当前目录,有个名为myscript的文件。(LCTT译注,此处原文有误。这里指定了记录文件名为myfile,而不是默认的 typescript。)
为何咱们要用script命令编辑器

由于在以前已经提到过,script命令的主要功能是记录全部的东西。下面给出了两个使用该命令的场景。
和同事共事时ui

当和同事一块儿工做时,咱们能够经过script来记录你的活动。命令行

好比,咱们会使用名为collaborate的打印文件,来完成打印:日志

$ script collaborate

而后,在完成一些任务后,假如你须要把你干的活发给另一个工程师,那就把那文件发给他。因此当另一个工程师须要复查所作的事情,他只要用文本编辑器打开这个文件就好了。code

若是他想要更新该文件(以增长他的工做部分),可使用-a选项。

$ script -a collaborate

记录某人在终端中的所做所为

你可能让你的工程师或者某我的远程访问你的系统,要确保你的工程师正在干正确的事,你能够记录下他在你系统上的所做所为。要让script命令在登陆时自动运行,咱们能够把它添加进shell环境配置文件中。若是你正在使用bash shell,把这一行加进你的bash环境配置文件中。

$ vi ~/.profile
 
# run the script command to record everything
# use -q for quite and -a option to append the script
#
/usr/bin/script -qa /usr/local/script/log_record_script

而后保存。下次他登陆进你的系统时,script命令就会自动运行,并把日志记录进/usr/local/script/logrecordscript。

-q选项可让scirpt命令以静默模式运行,登陆进来的用户不会知道script命令已经运行了。而-a选项将会让记录附加到文件中,而不会擦除先前的记录。

若是不使用-q选项,那么当用户登陆进来时,他会收到像下图中这样的通知。

退出记录

要退出记录活动,咱们能够在终端中按下Ctrl+D,或者输入exit。在退出script前,你会发现记录文件的大小为0 Kb,而在退出以后,文件大小会发生改变。
结尾

Script命令在你须要记录或者存档终端活动时可能颇有用,记录文件会存储为文本文件,因此能够很方便地用文本编辑器打开。跟日常同样,咱们均可以经过输入man script或者scirpt -h来显示帮助页并查看更多详细用法。


在书上看到两个颇有趣的命令——scriptsrciptreplay,它能够把终端会话记录到一个文件中,便是说咱们能够经过终端会话来来制做命令行技巧视频教程,也能够与他人分享会话文件,并且生成的文件还只是通常的文本文件,文件的大小很是小,真是很是有意思。下面是本人写的两个shell程序,来方便进行这个有趣并有意义的操做。

1、实现代码

文件:Record.sh

代码以下:

#! /bin/bash 
# Filename:Record.sh 
 
read -p "Please input the sesson filename you want to creat: " filename; 
 
sesfile="$filename.session" 
logfile="$filename.timing.log" 
 
if [ -e $sesfile ];then 
    echo "$sesfile is Exsit,Creat session file fault!"; 
    read -p "If you want to reload the file? [Y/N]: " flag; 
    if [ "$flag" = "Y" ];then 
        rm $sesfile $logfile; 
        script -t 2> $logfile -a $sesfile; 
    else 
        echo "Nothing to do!"; 
    fi 
 
else 
    script -t 2> $logfile -a $sesfile; 
fi

文件:Replay.sh

代码以下:

#! /bin/bash 
# Filename:Replay.sh 
 
read -p "Please input the session filename: " filename 
logfile="$filename.timing.log" 
sesfile="$filename.session" 
if [ -e $sesfile ]; then 
    scriptreplay $logfile $sesfile 
    echo 
else 
    echo "$filename is NOT Exsit!" 
fi

2、程序分析

首先来讲说这两个文件分别是用来干什么的吧,Record.sh是用来记录你所执行的命令和屏幕的输出的,而Replay.sh是用来回放Record.sh所录制的内容的。

在Record.sh中,首先要求你输入一个用来保存信息的文件名,如output,而后在程序中建立两个文件,文件名为你所输入的文件名加上不一样的后缀造成,如output.timing.log和output.session,而后检查所输入的文件是否已存在,若存在,则询问是否以新的文件覆盖旧的文件,如果,则删除原有文件,建立新的文件并写入数据,若否,则不作任何工做。Replay.sh中输入一个文件名,首先判断该文件是否存在,存在则播放。

在Record.sh中,能够看到script的参数是两个文件,为了便于辨认,我在输入的文件名加上了特定的后缀,即便在Linux上,文件后缀是没意义的,其中一个后缀的.timing.log,用于存储时序信息,描述每个命令在什么时候运行,另外一个文件,后缀为.session,用于存储命令输出。有了这两个文件就能够实现播放功能,这就有点像你们熟悉的Windows下的lrc歌词文件的播放功能吧,我的以为。

而因为有两种输出,因此就要用数据流重定向,把不一样的输出流输出不一样的文件中,在Record.sh中咱们也能够看到,咱们用2>把时序信息经过stderr写入文件.timing.log,经过>把命令执行信息写入文件.session。

而Replay.sh则相对简单,它只须要判断输入的文件是否存在,就能够进行播放。如你想播放上面Record.sh中制做的文件,则只须要输入output便可。

相关文章
相关标签/搜索