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

探索Linux中的`script`命令:记录你的终端会话 script命令启动一个新的shell会话,并将该会话中所有的输入(用户键入的命令)和输出(命令的执行结果)记录到指定的文件中。这对于需要重现会话、分析命令执行过程或创建教程文档等场景非常有帮助。在数据处理和分析中,它可以用来记录长时间运行的脚本或命令的执行过程,便于后续分析和调试。 阅读详情

作家Philip G. Ezolt在其作品<<Optimizing Linux Performance: A Hands On Guide to Linux Performance Tools>>的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 <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[=<file>]   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去存放具体的记录内容。注意这里的-t和script_time.time中间没有空格。

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

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

之后会像放电影一样将刚才的操作重复一遍,例如下面的gif我在跑完命令后没有任何操作
script_crop.gif

使用场景

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

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

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

总结

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

script 命令详解:记录终端会话的利器 script命令是Unix/Linux系统中用于记录终端会话的强大工具。本文深入解析了其技术原理、使用方法及实际应用场景。script通过伪终端(PTY)机制捕获所有终端输入输出,支持多种选项如指定输出文件(-a追加)、安静模式(-q)和时间戳记录(--timing)。高级功能包括实时刷新(-f)、结合tee命令输出到多个目的地,以及使用scriptreplay回放会话。实际应用中,script可用于系统故障排查、技术教学演示和自动化测试记录,能完整保存操作过程便于后续分析。 阅读详情

相关推荐

Asciinema: 终端录制与回放工具

摘要 Asciinema 是一款开源的终端会话录制工具,采用基于文本的录制方式,相比传统视频录制具有文件体积小、播放清晰度高和交互性强等优势。本文全面介绍了 Asciinema 的核心特性、安装方法、基本使用(包括rec、play、upload等命令)、高级配置选项、内容分享方式以及自托管服务部署。该工具特别适合开发者用于教学演示、操作审计和命令行技巧分享,支持Linux、macOS等系统,可通过配置文件自定义录制行为,并允许将录制内容转换为GIF/MP4格式或嵌入网页文档。

技术分享 1135

shell中 执行后台命令后的打印保存到文件

test_code -param >> log 2>&1 &

QQ839787886的博客 4293

Linux终端输出记录全攻略:重定向、tee、script与组合技巧

在Linux系统管理与开发中,标准输入输出(stdin/stdout/stderr)是进程通信的基础机制,通过文件描述符实现数据流的定向传输。理解I/O重定向原理是掌握输出记录的核心,它允许将命令结果从默认的屏幕输出转向文件存储,从而提升工作效率与可追溯性。这一技术对于日志收集、调试排错、操作审计等场景具有重要价值,尤其在自动化脚本和持续集成环境中不可或缺。本文聚焦于终端输出记录的多种实践方案,涵盖基础的重定向操作、实时分屏记录的tee命令,以及完整会话录制的script工具,并深入探讨如何结合【进程替换】

weixin_42528780的博客 319

【Linux学习 】Linux使用Script命令来记录并回放终端会话

一背景 二script命令简介 1 什么script命令 2 script命令操作 21 file选项 22 options选项 23 退出script 三Script命令结合实际使用场景 1 先在终端执行script命令记录scp命令过程 2 在脚本文件中添加script命令来记录scp的执行过程 四总结 五参考链接一、背景在之前的博客 【Git学习–>如何通过Shell脚本实现 监控Gitla

字节卷动 2万+

Linux终端作业控制与监控:从前后台管理到会话记录实战

在Linux/Unix系统中,进程管理与终端I/O控制是系统运维和开发的基础能力。其核心原理涉及进程组、会话机制以及信号处理,例如SIGTTOU信号用于管理后台作业的终端输出。掌握这些原理的技术价值在于提升对命令行环境的深度掌控力,实现多任务并行与状态持久化。典型的应用场景包括长时间编译任务管理、远程故障排查过程记录以及自动化部署中的交互处理。通过结合作业控制命令、tmux/screen会话管理以及script/expect等工具,可以构建一个可暂停、可恢复、可记录的工作空间,这正是实现终端键屏监控和操作回

weixin_34332905的博客 378

使用Linux中的`script`命令记录服务器屏幕输出

命令,我们可以轻松地记录服务器的屏幕输出,并将其保存到文件中。在Linux系统中,我们经常需要记录服务器的屏幕输出,以便后续分析和故障排查。执行这个命令后,所有的终端输出将会被记录到。接下来,你可以执行任何命令或操作,所有的输出都会被记录下来。命令来创建一个记录会话,并将会话中的所有输出保存到一个文件中。终端会话将会结束,并且记录的输出将会保存到指定的文件中。命令退出终端,会话结束,记录的输出保存到了文件中。命令开始记录会话,并指定输出文件为。命令来记录服务器的屏幕输出。,这些命令的输出都被记录到了。

XhClojure的博客 757

script命令

参考:http://www.cnblogs.com/cornell/p/3833955.htmlhttps://linux.cn/article-3195-1.htmlUsage:script [options] [file]Options:-a, --append 附加输出-c, --command &lt;command&gt;...

我的学习笔记 2613

使用Script命令记录Linux会话过程

在Linux系统中,有时候我们需要记录终端会话的过程,包括输入的命令和输出的结果。命令是一个非常有用的工具,可以帮助我们记录和回顾Linux终端会话的过程。通过记录会话,我们可以更好地理解和分析命令的执行过程,并与他人共享我们的操作过程。你将看到所有输入的命令和输出的结果,包括命令的执行时间戳。通过这种方式,你可以方便地记录和回顾会话,以及与他人共享你的终端操作过程。命令可以在终端会话期间记录所有的输入和输出,并将其保存到一个指定的文件中。执行你想要记录的命令,并进行相应的操作。除了基本的使用方法,

与其临渊羡鱼,不如退而结网 491

Linux中记录终端(Terminal)输出到文本文件四种方法

Linux中记录终端(Terminal)信息输出到文本文件四种方法

qq_44681788的博客 6万+

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5511

若依(RuoYi)项目里,Quartz定时任务踩坑实录:并发控制、事务回滚与异常处理

本文深入解析若依(RuoYi)项目中Quartz定时任务的并发控制、事务回滚与异常处理三大核心问题。通过实战案例揭示@DisallowConcurrentExecution注解的局限性和Redis分布式锁的应用,详细讲解Spring事务集成方案及多数据源事务管理,并提供生产级监控体系搭建指南,帮助开发者规避Quartz在生产环境中的常见陷阱。

weixin_28731223的博客 407

Linux中记录终端输出到文本文件

 一,如何把命令运行的结果保存到文件当中? 这个问题太简单了,大家都知道,用 > 把输出转向就可以了    例子:  $ ls > ls.txt #或者ls-->ls.txt #把ls命令的运行结果保存到文件ls.txt中   [lhd@hongdi ~]$ ls > ls.txt   [lhd@hongdi ~]$ cat ls.txt   ...

琦彦 7457

「深度学习之优化算法」(五)差分进化算法

每次迭代将先进行变异操作,选择一个或多个个体的基因作为基,然后选择不同的个体的差分来构成差分基因,最后将作为基的基因与差分基因相加来得出新的个体。,大喊一声,进化吧,魔王兵i的基因改变了。交叉率CR,影响基因取自变异基因的比例,由于至少要保留一位自己的基因和变异的基因导致CR在该问题上对算法性能的影响不大(这个问题比较简单,维度较低,影响不大)。与遗传算法同为进化算法的差分进化算法,它们的操作(算子)也都非常相似的,都是交叉,变异和选择,流程也几乎一样(遗传算法先交叉后变异,差分进化算法先变异后交叉)。

quanzhan_King的博客 1505

【strace命令详解:Linux下的强大跟踪工具 】

🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊 🌸愿您在此停留的每一刻,都沐浴在轻松愉悦的氛围中。 📖这里不仅有丰富的知识和趣味横生的内容等您来探索,更是一个自由交流的平台,期待您留下独特的思考与见解。🌟 🚀让我们一起踏上这段探索与成长的旅程,携手挖掘更多可能,共同进步!💪✨

种一棵树,最好的时间是十年前,其次是现在。 1591

vscode 配置 codeql

vscode 配置 codeql

SHELLCODE_8BIT的博客 1439

基于 Simulink 的飞轮储能系统(Flywheel Energy Storage System, FESS)充放电协调控制实战教程

本教程详细介绍了基于Simulink的飞轮储能系统(FESS)建模与控制方法。系统采用永磁同步电机(PMSM)和背靠背变流器架构,包含机侧全速域矢量控制和网侧直流稳压控制。重点讲解了机电耦合建模、FOC控制算法实现、基于电压下垂的协调控制策略,以及混合储能系统设计思路。教程提供了MATLAB函数代码示例,并给出典型工况下的仿真波形分析指南,同时指出了常见问题解决方案。该模型可用于研究飞轮储能在调频、能量回收等场景的应用,为新能源消纳和微网稳定提供仿真工具。

MHD0815的博客 165

Linux history 命令详解:如何查看、显示时间、清空、重复和控制历史记录

在 Linux 中,如果你使用终端操作系统(sh、bash、zsh、fish等),那么有一个非常强大且方便的命令叫做history。它的作用是让你查看之前终端中输入的所有命令记录,以及可以方便地快速重复执行某个命令或修改一些参数后重新执行。

u012964600的博客 4万+

Python爬虫:抓取专利数据并分析专利趋势

本文展示了如何使用 Python 爬虫技术抓取中国专利数据,并对数据进行了清洗、分析和趋势预测。通过分析专利数据,企业和科研机构可以了解行业的技术发展趋势,进行技术创新战略规划。未来,我们可以进一步扩展爬虫的功能,抓取更多专利数据,增加多维度的数据分析,如技术领域、地域分布等。同时,可以尝试使用深度学习模型(如 LSTM)进行时间序列预测,以获得更准确的专利趋势预测。

2201_76125261的博客 1785

Linux dd 命令详解:用于按块复制和转换数据的强大工具

命令是 Linux 和 Unix 系统中用于按块复制和转换数据的强大工具。它能够直接操作磁盘、备份数据、制作启动盘、测试磁盘性能等。能够直接读写设备文件,因此使用时需要特别小心,否则可能会导致数据丢失或覆盖重要数据。不会提示任何确认信息,因此执行前请仔细检查命令,避免误操作!,能极大提高 Linux 下磁盘管理和数据处理的效率!默认不显示进度,但可以配合。count=<数值>

yangchuang111213的博客 3151

华为HCIE之TS部分整理

TroubleShooting 整体拓扑 1. MSTP 题目需求:site1 中,CLIENT1 属于 VLAN12,CLIENT3 属于 VLAN34;MSTP 中的 VLAN12 属于 instance1,vlan34 属于 instance2;两个 instance 的主备根桥分别在 SW1 和 SW2 上,并且要求 CLIENT1访问 R1 时经过的路径是 SW3-SW1-R1;同时要求 CLIENT3 访问 R1 时经过的路径是SW3-SW2-R1; 排错思路: ①查看SW3 SW1 SW

ledrsnet的博客 5756

2025华为杯第二十二届中国研究生数学建模竞赛D题:低空湍流监测及最优航路规划 - 完整解题分析+完整MATLAB源码!(上篇)

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 2583

Linux小课堂: 命令行高效操作指南:命令补全、历史记录与终端快捷键深度解析

摘要 本文系统介绍了Linux命令行效率提升技巧,涵盖三大核心模块:1) Tab键智能补全机制,详解命令/路径补全逻辑及分页处理;2) 命令历史管理,包括方向键回溯、Ctrl+R反向搜索及history命令应用;3) 终端快捷键体系,列举15种常用组合(如Ctrl+A行首跳转、Ctrl+U整行删除等),结合NestJS开发场景演示复杂命令编辑流程。所有技巧均基于GNU Readline库实现,可无缝应用于Bash、Zsh等Shell环境,特别适合需要频繁操作命令行的开发者与系统管理员。

Wang的专栏 2250

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux命令history:你的终端历史记录器

在Linux系统中,history命令是一个非常实用且经常被忽视的工具。它允许用户查看、搜索和操作在终端会话中执行过的命令历史。通过理解和利用history命令,我们可以更有效地在终端中工作,避免重复输入相同的命令,以及更好地管理我们的命令历史。

听风的鱼鱼儿 1606

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux中记录终端(Terminal)输出到文本文件

花了好大功夫,却发现这个是个很好的办法。 转自:http://www.2cto.com/os/201307/224002.html Linux中记录终端(Terminal)输出到文本文件    一,如何把命令运行的结果保存到文件当中?   这个问题太简单了,大家都知道,用 > 把输出转向就可以了   例子:   [lhd@hongdi ~]$ ls

靖远CserRise的专栏 3114

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux中记录终端输出到txt文本文件

转载: http://blog.youkuaiyun.com/tengh/article/details/41823883一,把命令运行的结果保存到文件当中:用 &gt; 把输出转向就可以了  例子:  $ ls &gt; ls.txt    #或者 ls--&gt;ls.txt    #把ls命令的运行结果保存到文件ls.txt中    说明: &gt; 是把输出转向到指定的文件,如文件已存在的话也会重新写...

zhenguo26的博客 1万+

Linux中记录终端输出到一个文本文件

一,把命令运行的结果保存到文件当中:用 &gt; 把输出转向就可以了   例子:   $ ls &gt; ls.txt    #或者 ls--&gt;ls.txt    #把ls命令的运行结果保存到文件ls.txt中      说明: &gt; 是把输出转向到指定的文件,如文件已存在的话也会重新写入,文件原内容不会保留        &gt;&gt; 是把输出附向到文件的后面,文件原内容会保留下来...

gengyiping18的专栏 1921
上一篇: Windows server 2012 R2 搭建文件服务器(二):实现分享功能
下一篇: windows环境快速创建指定大小的文件:fsutil命令详解
T型人小付
博客等级 码龄7年 433粉丝 210原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值