强大的Linux终端行为记录和回放工具:script命令详解

文章目录

    • 简单介绍
    • 使用方法详解
      • 常规使用
      • 参数详解
    • 使用场景
    • 总结

作家Philip G. Ezolt在其作品<>的1.1章节中建议读者在尝试解决Linux问题的时候,将在终端上跑的命令都完整记录下来,以便后续进行问题复现或者是回查。其中还重点推荐了这个script命令,这一节我们来一起看看这到底是个什么命令。

It is better just to record exactly what you typed. You can then reproduce the exact command line for a future test, and when reviewing past results, you can also see exactly what you measured. The Linux command script (described in detail in Chapter 8, “Utility Tools: Performance Tool Helpers”) or “cut and paste” from a terminal is a good way to do this.

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

简单介绍

script命令用来记录终端的行为及结果,并存储成本地文件,可以直接用编辑器打开进行查看。同时可以记录时间轴信息,利用scriptreplay命令进行动态查看。

使用方法详解

利用script -h查看其帮助文档,如下

[root@testmachine ~]# script -h

Usage:
 script [options] [file]

Options:
 -a, --append            append the output
 -c, --command  run command rather than interactive shell
 -e, --return            return exit code of the child process
 -f, --flush             run flush after each write
     --force             use output file even when it is a link
 -q, --quiet             be quiet
 -t, --timing[=]   output timing data to stderr (or to FILE)
 -V, --version           output version information and exit
 -h, --help              display this help and exit

常规使用

首先这个命令是可以不接任何参数直接跑的,例如

[root@testmachine ~]# script
Script started, file is typescript
[root@testmachine ~]#

这个时候终端提示我们已经开始记录了,并且记录的内容会存储到当前目录的一个叫做typescript的文件中。我们尝试敲两个命令试试,发现和正常使用终端没有任何异样

[root@testmachine ~]# script
Script started, file is typescript
[root@testmachine ~]# echo "Life is awesome."
Life is awesome.
[root@testmachine ~]# date
Tue Dec  3 17:56:42 +08 2019
[root@testmachine ~]#

打开另一个终端,发现当前目录下确实有个typescript文件,创建时间和跑script的时间吻合,不过大小为0,说明我们的操作并没有被实时记录进去

-rw-r--r--   1 root root    0 Dec  3 17:52 typescript

然后回到之前的终端跑exit命令退出记录,这时候终端提示我们记录结束了

[root@testmachine ~]# script
Script started, file is typescript
[root@testmachine ~]# echo "Life is awesome."
Life is awesome.
[root@testmachine ~]# date
Tue Dec  3 17:56:42 +08 2019
[root@testmachine ~]# exit
exit
Script done, file is typescript
[root@testmachine ~]#

再次查看typescript文件,发现大小变化了,访问时间说明是刚才修改的

-rw-r--r--   1 root root  385 Dec  3 18:00 typescript

打开看看到底记录了些啥

[root@testmachine ~]# cat typescript
Script started on Tue 03 Dec 2019 05:52:57 PM +08
[root@testmachine ~]# echo "Life is awesome."
Life is awesome.
[root@testmachine ~]# date
Tue Dec  3 17:56:42 +08 2019
[root@testmachine ~]# exit
exit

Script done on Tue 03 Dec 2019 06:00:55 PM +08
[root@testmachine ~]#

发现记录的开始时间,结束时间,以及中间的所有交互情况都被完整地记录了下来。所以这个命令有个很重要的应用场景就是对远程访问用户进行行为监控,在被监控的用户的~/.profile文件中跑一下这个命令即可,当然我们可以利用参数指定保存的路径。

参数详解

  • file参数
    除了使用默认的文件来存储,还可以指定文件名
[root@testmachine ~]# script script.log
Script started, file is script.log
[root@testmachine ~]#

停止记录后发现效果一样

[root@testmachine ~]# script script.log
Script started, file is script.log
[root@testmachine ~]# date
Tue Dec  3 18:23:33 +08 2019
[root@testmachine ~]# exit
exit
Script done, file is script.log
[root@testmachine ~]#
-rw-r--r--   1 root root  280 Dec  3 18:23 script.log
  • -a参数
    用来在现有的记录文件中进行追加,而不是覆盖,例如我在刚才的记录的基础上再进行一次记录,这一次带上-a参数
[root@testmachine ~]# script -a script.log
Script started, file is script.log
[root@testmachine ~]# echo "You are beautiful."
You are beautiful.
[root@testmachine ~]# date
Tue Dec  3 18:25:43 +08 2019
[root@testmachine ~]# exit
exit
Script done, file is script.log
[root@testmachine ~]#

打开script.log文件会发现新的记录是被追加上去的,而不是覆盖

[root@testmachine ~]# cat script.log
Script started on Tue 03 Dec 2019 06:22:02 PM +08
[root@testmachine ~]# date
Tue Dec  3 18:23:33 +08 2019
[root@testmachine ~]# exit
exit

Script done on Tue 03 Dec 2019 06:23:36 PM +08
Script started on Tue 03 Dec 2019 06:25:22 PM +08
[root@testmachine ~]# echo "You are beautiful."
You are beautiful.
[root@testmachine ~]# date
Tue Dec  3 18:25:43 +08 2019
[root@testmachine ~]# exit
exit

Script done on Tue 03 Dec 2019 06:25:45 PM +08
[root@testmachine ~]#
  • -f参数
    正常情况下没有停止记录的话,记录的结果是不会实时写入到文件中的。但是加了这个参数就可以强制性让记录实时写入文件。
    例如我开始记录的时候,文件的大小就已经不是0
[root@testmachine ~]# script -f script_force.log
Script started, file is script_force.log
[root@testmachine ~]#
-rw-r--r--   1 root root  103 Dec  3 22:27 script_force.log

随着我不停记录,文件也在不停变大

[root@testmachine ~]# script -f script_force.log
Script started, file is script_force.log
[root@testmachine ~]# date
Tue Dec  3 22:29:24 +08 2019
[root@testmachine ~]#
-rw-r--r--   1 root root  184 Dec  3 22:29 script_force.log

这就引出了script命令另一个应用场景,就是实时远程监控。一个人跑mkfifo foo; script -f foo命令,然后另一个人可以通过跑cat foo去进行实时监控

  • -q参数
    如果不想让终端提示记录的开始和结束可以用这个参数开启安静模式,但是个人觉得这个安静模式容易让人困惑,不太建议使用
[root@testmachine ~]# script -q script_quiet.log
[root@testmachine ~]# date
Tue Dec  3 22:23:01 +08 2019
[root@testmachine ~]# exit
exit
[root@testmachine ~]#
  • -c参数
    后面接一串命令,只是针对这一串命令进行记录,记录完毕就自动退出。
[root@testmachine ~]# script script_command.log -c "date;echo 'I love Linux';uname -a"
Script started, file is script_command.log
Tue Dec  3 22:41:09 +08 2019
I love Linux
Linux testmachine 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Script done, file is script_command.log
[root@testmachine ~]#

有的时候我们会发现一个命令在终端上跑没有报错,但是放到cron里面的时候就会出错,就可以在cron里面用script去跑这个命令。解决crontab里面的命令报错是这个命令的第三个应用场景

  • -t参数
    在另一个文件中保存时序信息,方便动态记录。感觉这个就是script命令强大的地方。
[root@testmachine ~]# script -tscript_time.time script_time.log
Script started, file is script_time.log
[root@testmachine ~]# date
Tue Dec  3 22:45:24 +08 2019
[root@testmachine ~]# uname -a
Linux testmachine 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@testmachine ~]# exit
exit
Script done, file is script_time.log
[root@testmachine ~]#

上面我用script_time.time文件去存储时序信息,用script_time.log去存放具体的记录内容。注意这里的-tscript_time.time中间没有空格

回放的时候需要用到scriptreplay命令

[root@testmachine ~]# scriptreplay -t script_time.time -s script_time.log

之后会像放电影一样将刚才的操作重复一遍,例如下面的gif我在跑完命令后没有任何操作
强大的Linux终端行为记录和回放工具:script命令详解_第1张图片

使用场景

上面在讲解参数的时候基本将这个命令的使用场景也总结的差不多了

  • 排查问题时候的终端交互记录
  • 远程访问用户的行为记录
  • 远程实时监控
  • 排查crontab的报错问题

如果你能想到别的使用场景欢迎在下面留言分享给我哈

总结

在排查问题的过程当中有效而完整的记录能帮助我们节省不少时间,强大的script命令能帮助我们实现这一功能,赶紧去试一试吧。

你可能感兴趣的:(Shell学习)