UNPKG

5.05 kBMarkdownView Raw
1script
2===
3
4记录终端会话的所有操作
5
6## 补充说明
7
8**script** 用于在终端会话中,记录用户的所有操作和命令的输出信息。简而言之,记录终端会话发生的一切信息,如同一台终端录像机。例如,用户在输入某条命令时,字符的键入和删除也都会被记录。用户在终端的所有操作、终端的回显等信息会被以 `raw` 格式存储在日志文件,称为终端数据文件。命令的时间信息会被单独以另一种结构储存为日志文件,称为时间日志文件。使用命令`exit`或者快捷键`Ctrl + D`停止记录。
9
10
11### 语法
12
13```shell
14script(选项)(参数)
15```
16
17### 选项
18
19```shell
20-a, --append # 对终端会话的操作信息,以追加方式写入文件(保留原文件内容)
21-c, --command command # 只运行 command 命令而不打开交互终端。相当于开启 script ,执行 command ,再退出 script
22 # command 可以是任意能够在终端会话执行的命令
23-e, --return # 返回子进程的退出状态码
24-f, --flush # 每次终端的内容发生变动,立马写入日志文件
25--force # 允许默认输出终端数据文件为符号链接
26-o, --output-limit size # 限制终端数据文件和时间日志文件的大小,当文件大小达到此限制就会退出子进程
27 # size 的单位可以设置为:KiB(=1024)、KB(=1000)、MiB(1024*1024)、MB(=1000*1000)
28 # 同理还支持 GiB TiB PiB EiB ZiB YiB GB TB PB EB ZB YB
29-q, --quiet # 安静模式。启动和退出script命令不显示任何提示
30-t[file], --timing[=file] # 输出时间日志信息到标准错误(stderr)或者文件
31-V, --version # 显示版本信息并退出
32-h, --help # 显示帮助文本并退出
33```
34
35### 参数
36
37* 终端数据文件:设置存储终端数据信息的文件名称
38
39### 实例
40
41```shell
42script # 开启记录,默认会在当前目录创建名称为 typescript 的文件来保存终端数据文件
43script command.log # 开启记录,在当前目录创建名称为 command.log 的文件来保存终端数据文件
44script -t 2>time.file command.log # 开启记录,在当前目录创建名称为 command.log 的文件来保存终端数据文件
45 # 在当前目录创建名称为 time.file 的文件来保存时间日志文件
46```
47
48 **以追加模式记录终端信息**
49
50```shell
51zfb@localhost:~$ script -t 2>time.file -a -f command.log
52Script started, file is command.log
53zfb@localhost:~$ echo "hello, world"
54hello, world
55zfb@localhost:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
562020-12-23 20:48:46
57zfb@localhost:~$ echo "Bye"
58Bye
59zfb@localhost:~$ ls -al
60total 20
61drwxr-xr-x 2 zfb zfb 4096 Dec 23 20:48 .
62drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
63-rw-r--r-- 1 zfb zfb 0 Dec 23 19:03 a.txt
64-rw-r--r-- 1 zfb zfb 12 Dec 23 19:04 b.txt
65-rw-r--r-- 1 zfb zfb 2744 Dec 23 20:49 command.log
66-rw-r--r-- 1 zfb zfb 790 Dec 23 20:49 time.file
67zfb@localhost:~$ exit
68Script done, file is command.log
69zfb@localhost:~$
70```
71
72然后,用户可以查看终端数据文件,使用方法如下
73
74```shell
75zfb@localhost:~$ cat command.log
76Script started on 2020-12-23 20:48:25+08:00 [TERM="xterm-256color" TTY="/dev/pts/0" COLUMNS="75" LINES="30"]
77zfb@localhost:~$ echo "hello, world"
78hello, world
79zfb@localhost:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
802020-12-23 20:48:46
81zfb@localhost:~$ echo "Bye"
82Bye
83zfb@localhost:~$ ls -al
84total 20
85drwxr-xr-x 2 zfb zfb 4096 Dec 23 20:48 .
86drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
87-rw-r--r-- 1 zfb zfb 0 Dec 23 19:03 a.txt
88-rw-r--r-- 1 zfb zfb 12 Dec 23 19:04 b.txt
89-rw-r--r-- 1 zfb zfb 2744 Dec 23 20:49 command.log
90-rw-r--r-- 1 zfb zfb 790 Dec 23 20:49 time.file
91zfb@localhost:~$ exit
92
93Script done on 2020-12-23 20:49:04+08:00 [COMMAND_EXIT_CODE="0"]
94zfb@localhost:~$
95```
96
97其中,只有命令`cat command.log`是用户输入,其他均为自动呈现。通过查看上面输出的时间`2020-12-23 20:48:46`,可以证明,这是重现的记录,而非重新执行一遍命令。也就是说,可以把`time.file``command.log`文件移动到任意一台机器上,都可以重现命令输入与终端回显。
98
99 **记录服务器用户会话操作**
100
101`root`身份编辑文件`/etc/profile`,在文件末尾追加以下内容
102
103```bash
104if [ $UID -ge 0 ]
105then
106 exec /usr/bin/script -t 2>/var/log/script-records/$USER-$UID-`date +%Y%m%d`.time -a -f -q /var/log/script-records/$USER-$UID-`date +%Y%m%d`.log
107fi
108```
109
110然后再以`root`身份创建文件夹用于存储服务器上的各个用户在终端的所有操作信息
111
112```bash
113sudo mkdir -p /var/log/script-records/
114sudo chmod 733 /var/log/script-records/
115```
116
117最后,执行命令`source /etc/profile`即可。任意用户(`UID ≥ 0`)在终端执行的所有操作都会被安静地记录下来,以天为单位存储。
118
119
120