侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux script命令教程:如何记录和回放终端会话(附实例详解和注意事项)

Linux script 命令介绍

script(script - make typescript of terminal session)是一个用来制作终端会话记录的命令,它可以捕获终端上显示的所有内容,包括输入和输出,直到退出为止。默认情况下,所有的终端信息都保存在 typescript 文件中,如果没有给出参数。script 命令通常用于在安装程序或编译开源代码时记录命令的输出,或者在调试或教学时保存终端的日志。script 命令使用两个文件,一个用于终端输出,另一个用于记录时间信息。

Linux script 命令适用的 Linux 版本

script 命令是一个标准的 Linux 命令,它适用于大多数的 Linux 发行版,如 Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、RedHat/CentOS、Fedora、Raspbian 等。如果您的系统没有安装 script 命令,您可以根据您的发行版使用以下命令进行安装:

# 基于 apt 的发行版(如 Debian、Ubuntu、Raspbian、Kali Linux 等):
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install bsdutils

# 基于 yum 的发行版(如 RedHat,CentOS 7 等):
[linux@bashcommandnotfound.cn ~]$ sudo yum install util-linux

# 基于 dnf 的发行版(如 Fedora,CentOS 8 等):
[linux@bashcommandnotfound.cn ~]$ sudo dnf install util-linux

# 基于 apk 的发行版(如 Alpine Linux):
[linux@bashcommandnotfound.cn ~]$ sudo apk add --update util-linux

# 基于 pacman 的发行版(如 Arch Linux):
[linux@bashcommandnotfound.cn ~]$ sudo pacman -S util-linux

# 基于 zypper 的发行版(如 openSUSE):
[linux@bashcommandnotfound.cn ~]$ sudo zypper in util-linux

# 基于 pkg 的 FreeBSD 发行版
[linux@bashcommandnotfound.cn ~]$ sudo pkg install util-linux

# 基于 pkg 的 OS X/macOS 发行版:
[linux@bashcommandnotfound.cn ~]$ brew install util-linux

Linux script 命令的基本语法

script 命令的基本语法如下:

script [选项] [文件]

其中,选项是可选的,用于指定 script 命令的行为。文件是可选的,用于指定保存终端信息的文件名,如果省略,则默认为 typescript。

Linux script 命令的常用选项或参数说明

script 命令的常用选项或参数如下表所示:

选项参数说明
-a追加模式,将输出追加到已有的文件中,而不是覆盖。多次运行 script 命令时,会在文件中添加一行表示日期和时间的分隔符。
-c命令执行指定的命令,而不是交互式的 shell,并将结果保存到文件中。命令执行完毕后,script 命令自动退出。
-e返回子进程的退出码,而不是 script 命令的退出码。
-f刷新模式,每次写入时都刷新输出,而不是缓冲。这对于远程协作很有用。
--force允许默认的输出文件 typescript 是硬链接或符号链接。
-q安静模式,不显示 script 命令开始和结束的提示信息,只执行并退出。
-t文件记录时间信息,用于与 scriptreplay 命令配合,实现终端活动的回放。文件是可选的,用于指定保存时间信息的文件名,如果省略,则默认为 typescript.timing。

Linux script 命令实例详解

下面给出一些 script 命令的常见实例,以便您更好地理解和使用该命令。

实例1:使用 script 命令记录终端会话

如果没有给出任何参数,script 命令会在当前目录下创建一个名为 typescript 的文件,用于保存终端的活动。要停止记录,只需输入 exit 命令,script 命令就会退出,并显示记录的字节数。例如:

[linux@bashcommandnotfound.cn ~]$ script
Script started, file is typescript
[linux@bashcommandnotfound.cn ~]$ whoami
linux
[linux@bashcommandnotfound.cn ~]$ date
Fri Jan 26 14:38:20 HKT 2024
[linux@bashcommandnotfound.cn ~]$ exit
exit
Script done, file is typescript

这样,我们就可以在 typescript 文件中查看刚才的终端操作,例如:

[linux@bashcommandnotfound.cn ~]$ cat typescript
Script started on Fri 26 Jan 2024 02:38:20 PM HKT
[linux@bashcommandnotfound.cn ~]$ whoami
linux
[linux@bashcommandnotfound.cn ~]$ date
Fri Jan 26 14:38:20 HKT 2024
[linux@bashcommandnotfound.cn ~]$ exit
exit

Script done on Fri 26 Jan 2024 02:38:24 PM HKT

实例2:使用 script 命令将终端会话保存到指定文件

如果我们想要将终端的活动保存到自定义的文件名,而不是默认的 typescript,我们可以在 script 命令后面加上文件名作为参数。例如,我们想要将终端的活动保存到 mylog.txt 文件中,我们可以这样做:

[linux@bashcommandnotfound.cn ~]$ script mylog.txt
Script started, file is mylog.txt
[linux@bashcommandnotfound.cn ~]$ uname -a
Linux bashcommandnotfound.cn 5.10.0-0.bpo.5-amd64 #1 SMP Debian 5.10.24-1~bpo10+1 (2021-03-29) x86_64 GNU/Linux
[linux@bashcommandnotfound.cn ~]$ exit
exit
Script done, file is mylog.txt

这样,我们就可以在 mylog.txt 文件中查看刚才的终端操作,例如:

[linux@bashcommandnotfound.cn ~]$ cat mylog.txt
Script started on Fri 26 Jan 2024 02:40:12 PM HKT
[linux@bashcommandnotfound.cn ~]$ uname -a
Linux bashcommandnotfound.cn 5.10.0-0.bpo.5-amd64 #1 SMP Debian 5.10.24-1~bpo10+1 (2021-03-29) x86_64 GNU/Linux
[linux@bashcommandnotfound.cn ~]$ exit
exit

Script done on Fri 26 Jan 2024 02:40:16 PM HKT

实例3:使用 script 命令追加终端会话到已有文件

如果我们想要将终端的活动追加到已有的文件中,而不是覆盖它,我们可以使用 -a 选项。这样,每次运行 script 命令时,都会在文件中添加一行表示日期和时间的分隔符。例如,我们想要将终端的活动追加到 mylog.txt 文件中,我们可以这样做:

script -a mylog.txt

这条命令会将当前终端的所有活动追加到 mylog.txt 文件中,而不会覆盖已有内容。一旦执行该命令,就会在文件中添加一行表示日期和时间的分隔符,这样可以方便我们区分不同会话的记录。

当我们想要停止追加记录时,可以简单地在终端输入 exit 命令,即:

exit

这将结束 script 命令的执行,同时将终端活动的最后状态也追加到 mylog.txt 文件中。

实例4:使用 script 命令执行指定的命令并保存结果

如果我们只想要执行一个特定的命令,而不是交互式的 shell,并将结果保存到文件中,我们可以使用 -c 选项,并在后面跟上要执行的命令。这样,script 命令会在执行完命令后自动退出,而不需要我们输入 exit 命令。例如,我们想要执行 ls -l 命令,并将结果保存到 mylog.txt 文件中,我们可以这样做:

[linux@bashcommandnotfound.cn ~]$ script -c "ls -l" mylog.txt
Script started, file is mylog.txt
Script done, file is mylog.txt

这样,我们就可以在 mylog.txt 文件中查看刚才的命令输出,例如:

[linux@bashcommandnotfound.cn ~]$ cat mylog.txt
Script started on Fri 26 Jan 2024 02:45:32 PM HKT
total 16
-rw-r--r-- 1 linux linux  0 Jan 26 14:38 geeksforgeeks.txt
-rw-r--r-- 1 linux linux  0 Jan 26 14:40 mylog.txt
-rw-r--r-- 1 linux linux  0 Jan 26 14:42 typescript
-rw-r--r-- 1 linux linux  0 Jan 26 14:43 typescript.timing

Script done on Fri 26 Jan 2024 02:45:32 PM HKT

实例5:使用 script 命令记录时间信息并回放终端活动

如果我们想要记录终端活动的时间信息,以便于与 scriptreplay 命令配合,实现终端活动的回放,我们可以使用 -t 选项,并在后面跟上要保存时间信息的文件名,如果省略,则默认为 typescript.timing。这样,script 命令会在执行时记录每次输出的时间间隔和字符数,并保存到时间文件中。例如,我们想要记录终端活动的时间信息,并保存到 mytime.txt 文件中,我们可以这样做:

[linux@bashcommandnotfound.cn ~]$ script -t mytime.txt
Script started, file is typescript
[linux@bashcommandnotfound.cn ~]$ pwd
/home/linux
[linux@bashcommandnotfound.cn ~]$ sleep 3
[linux@bashcommandnotfound.cn ~]$ echo "Hello, world!"
Hello, world!
[linux@bashcommandnotfound.cn ~]$ exit
exit
Script done, file is typescript

这样,我们就可以在 mytime.txt 文件中查看刚才的时间信息,例如:

[linux@bashcommandnotfound.cn ~]$ cat mytime.txt
0.000000 13
0.000000 1
0.000000 11
0.000000 1
0.000000 10
0.000000 1
3.000000 1
0.000000 14
0.000000 1
0.000000 5
0.000000 1

这个文件包含两个数据字段,第一个字段表示自上次输出后经过的时间,第二个字段表示这次输出的字符数。现在,我们可以使用 scriptreplay 命令来回放刚才的终端活动,例如:

[linux@bashcommandnotfound.cn ~]$ scriptreplay mytime.txt
Script started on Fri 26 Jan 2024 02:48:12 PM HKT
[linux@bashcommandnotfound.cn ~]$ pwd
/home/linux
[linux@bashcommandnotfound.cn ~]$ sleep 3
[linux@bashcommandnotfound.cn ~]$ echo "Hello, world!"
Hello, world!
[linux@bashcommandnotfound.cn ~]$ exit
exit

Script done on Fri 26 Jan 2024 02:48:18 PM HKT

这样,我们就可以看到终端活动的回放,包括时间间隔和输出内容。如果我们想要调整回放的速度,我们可以在 scriptreplay 命令后面加上一个乘数,例如 2 表示加速两倍,0.5 表示减速一半,等等。

实例6:使用 script 命令刷新输出并实现远程协作

如果我们想要在每次写入时都刷新输出,而不是缓冲,这对于远程协作非常有用。我们可以使用 -f 选项。这样,我们可以在另一个终端中实时查看 script 命令的输出文件,就像在同一个终端中一样。

下面是一个实例,我们将在“终端1”上执行 script -f 命令,并在“终端2”上使用 tail -f 命令来查看输出文件。

首先开启“终端1”,输入如下命令:

[linux@bashcommandnotfound.cn ~]$ script -f ./myoutputfile
Script started, file is ./myoutputfile
$ echo 'Hello World'
Hello World
$ date
Mon Sep  16 06:37:22 CDT 2019
$ exit
Script done, file is ./myoutputfile

接着打开“终端2”,输入如下命令:

[linux@bashcommandnotfound.cn ~]$ tail -f ./myoutputfile
Script started on Mon Sep 16 06:37:11 2019
$ echo 'Hello World'
Hello World
$ date
Mon Sep  16 06:37:22 CDT 2019
$ exit
Script done on Mon Sep 16 06:37:28 2019

在这个例子中,“Hello World”和日期被记录在 "myoutputfile" 文件中。当我们在“终端2”中使用 tail -f 命令时,我们可以并行查看在“终端1”中发生的所有操作。当你需要和远程同事协作,或者需要其他人审查你所做的工作时,这个技巧非常有用。

实例7:使用 script 命令返回子进程的退出码

如果我们想要返回子进程的退出码,而不是 script 命令的退出码,我们可以使用 -e 选项。这样,script 命令会在执行完命令后退出,并返回命令的退出码。例如,我们想要执行 ls -l 命令,并返回其退出码,我们可以这样做:

[linux@bashcommandnotfound.cn ~]$ script -e -c "ls -l" /dev/null
Script started, file is /dev/null
Script done, file is /dev/null
[linux@bashcommandnotfound.cn ~]$ echo $?
0

这样,我们就可以看到 script 命令返回了 0,表示 ls -l 命令执行成功。如果我们执行一个不存在的命令,例如 foo,我们可以看到 script 命令返回了 127,表示 foo 命令未找到。例如:

[linux@bashcommandnotfound.cn ~]$ script -e -c "foo" /dev/null
Script started, file is /dev/null
bash: foo: command not found
Script done, file is /dev/null
[linux@bashcommandnotfound.cn ~]$ echo $?
127

实例8:使用 script 命令允许输出文件是硬链接或符号链接

如果我们想要允许输出文件是硬链接或符号链接,我们可以使用 --force 选项。这样,script 命令不会检查输出文件是否是硬链接或符号链接,而是直接写入。例如,我们想要将终端活动保存到一个符号链接文件,我们可以这样做:

[linux@bashcommandnotfound.cn ~]$ ln -s typescript mylink
[linux@bashcommandnotfound.cn ~]$ script --force mylink
Script started, file is mylink
[linux@bashcommandnotfound.cn ~]$ echo "Hello, world!"
Hello, world!
[linux@bashcommandnotfound.cn ~]$ exit
exit
Script done, file is mylink

这样,我们就可以在 mylink 文件中查看刚才的终端操作,例如:

[linux@bashcommandnotfound.cn ~]$ cat mylink
Script started on Fri 26 Jan 2024 03:00:12 PM HKT
[linux@bashcommandnotfound.cn ~]$ echo "Hello, world!"
Hello, world!
[linux@bashcommandnotfound.cn ~]$ exit
exit

Script done on Fri 26 Jan 2024 03:00:16 PM HKT

Linux script 命令的注意事项

在使用 script 命令时,有一些注意事项需要了解,例如:

  • script 命令会记录终端上显示的所有内容,包括控制字符和颜色代码,这可能会导致输出文件不易阅读或编辑。如果我们想要去除这些字符,我们可以使用 col -b 命令来过滤输出文件,例如:
[linux@bashcommandnotfound.cn ~]$ col -b < typescript > typescript.txt

这样,我们就可以在 typescript.txt 文件中查看更清晰的终端操作,例如:

[linux@bashcommandnotfound.cn ~]$ cat typescript.txt
Script started on Fri 26 Jan 2024 02:38:20 PM HKT
[linux@bashcommandnotfound.cn ~]$ whoami
linux
[linux@bashcommandnotfound.cn ~]$ date
Fri Jan 26 14:38:20 HKT 2024
[linux@bashcommandnotfound.cn ~]$ exit
exit

Script done on Fri 26 Jan 2024 02:38:24 PM HKT
  • script 命令会在输出文件中添加一些提示信息,如 Script started on ... 和 Script done on ...,这可能会影响输出文件的格式或内容。如果我们想要去除这些信息,我们可以使用 -q 选项来安静地执行 script 命令,或者使用 sed 命令来删除输出文件中的第一行和最后一行,例如:
[linux@bashcommandnotfound.cn ~]$ sed -i '1d;$d' typescript

这样,我们就可以在 typescript 文件中查看不含提示信息的终端操作,例如:

[linux@bashcommandnotfound.cn ~]$ cat typescript
[linux@bashcommandnotfound.cn ~]$ whoami
linux
[linux@bashcommandnotfound.cn ~]$ date
Fri Jan 26 14:38:20 HKT 2024
[linux@bashcommandnotfound.cn ~]$ exit
exit
  • script 命令会在输出文件中记录终端的输入和输出,这可能会导致输出文件中包含一些敏感信息,如密码或私钥等。如果我们想要避免这种情况,我们可以使用 stty -echo 命令来关闭终端的回显功能,或者使用 read -s 命令来读取不回显的输入,例如:
[linux@bashcommandnotfound.cn ~]$ script
Script started, file is typescript
[linux@bashcommandnotfound.cn ~]$ stty -echo
[linux@bashcommandnotfound.cn ~]$ read -p "Enter your password: " password
Enter your password: [linux@bashcommandnotfound.cn ~]$ echo "Your password is $password"
Your password is secret
[linux@bashcommandnotfound.cn ~]$ stty echo
[linux@bashcommandnotfound.cn ~]$ exit
exit
Script done, file is typescript

这样,我们就可以在 typescript 文件中查看不含密码的终端操作,例如:

[linux@bashcommandnotfound.cn ~]$ cat typescript
Script started on Fri 26 Jan 2024 03:05:12 PM HKT
[linux@bashcommandnotfound.cn ~]$ stty -echo
[linux@bashcommandnotfound.cn ~]$ read -p "Enter your password: " password
Enter your password: [linux@bashcommandnotfound.cn ~]$ echo "Your password is $password"
Your password is secret
[linux@bashcommandnotfound.cn ~]$ stty echo
[linux@bashcommandnotfound.cn ~]$ exit
exit

Script done on Fri 26 Jan 2024 03:05:16 PM HKT
  • 如果我们在执行 script 命令时,没有指定输出文件或指定了默认的输出文件 typescript,我们可能会遇到 bash: typescript: command not found 的错误,这是因为 typescript 也是一个 Linux 命令,用于处理 troff 格式的文档。为了避免这种冲突,我们可以使用不同的输出文件名,或者在执行 script 命令时,使用绝对路径或相对路径,例如:
[linux@bashcommandnotfound.cn ~]$ script /home/linux/typescript
Script started, file is /home/linux/typescript
[linux@bashcommandnotfound.cn ~]$ exit
exit
Script done, file is /home/linux/typescript

或者

[linux@bashcommandnotfound.cn ~]$ script ./typescript
Script started, file is ./typescript
[linux@bashcommandnotfound.cn ~]$ exit
exit
Script done, file is ./typescript

这些是 script 命令的一些注意事项,您可以根据您的实际情况来选择合适的选项和参数,来避免或解决一些可能出现的问题。如果您想要了解更多的 script 命令的用法和技巧,您可以参考以下的资料¹²³,或者在终端中输入 man script 或 help script 来查看帮助信息。希望您能喜欢这篇文章,并对您的学习有所帮助。谢谢您的阅读。

0

评论区