如何记录终端会话中的所有输入和输出?

如何在终端上记录所有的工作日志?例如,我想要一个关于通过终端对数据库进行的所有工作的记录。

这也是sudo的一部分。 - Wilhelm Erasmus
我已经添加了我的答案,你可以进行审核。 - Mansur Ul Hasan
4个回答

当你准备好开始记录日志文件时,请输入以下内容:
script screen.log

现在,在你停止脚本之前,终端中的所有输入和输出都将被存储在screen.log中。完成后,只需键入:
exit

您的 screen.log 文件将存储在本地目录中。如果您想要重定向它,请使用绝对路径名,例如 ~/screen.log。这将完全符合您的需求。

来源:Ubuntu指南 - 如何记录终端命令


嗨,谢谢回复。但是如果我使用以下顺序从shell登录到mysql数据库,这个方法是否有效:1)脚本screen.log 2)mysql -u <user> -p <database> 3)对数据库进行一些操作 4)退出;我发现文件screen.log已经创建了,但是它不包含数据库的日志。我会尽快分享这个文件。谢谢,Ankt。 - Ankit
2它应该与在控制台中读取“标准输入”(通常是键盘)和写入标准输出(通常是终端窗口)的所有内容一起工作。因此,它应该包括mysql命令行客户端。即使man页(man script)还提到了vi(编辑器)... - Izzy

你可能想试试Asciinema。除了可以录制视频外,你还可以分享和嵌入播放器到你的博客、文章或会议演讲中。

我有一个更好的方法来使用syslog记录每个shell命令,这可能会因Linux发行版而有所不同,但方法保持不变。
你需要按照以下步骤进行操作:
第一步(创建Syslog服务)
# vim /etc/rsyslog.d/bash.conf

local6.*    /var/log/commands.log

第二步(打开bashrc并输入以下命令)

# vim /root/.bashrc

# Enable CLI Logging by Mansur 08-12-2016 
whoami="$(whoami)@$(echo $SSH_CONNECTION | awk '{print $1}')"export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$whoami [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

第3号店(重新启动Syslog服务)

# /etc/init.d/rsyslog

这是一个日志示例:
Dec 7 22:13:00 validationdb2 mahasan: root@export [13291]: tail -f /var/log/mysql/mysql.log [0] Dec 7 22:13:09 validationdb2 mahasan: root@export [13291]: ls -lh [0] Dec 7 22:13:27 validationdb2 mahasan: root@export [13291]: touch test command [0]

无礼的策略!!! - Tom
嗨,曼苏尔,你能否解释一下你在做什么,那些命令很难理解,至少对我来说是这样。 - Jasser
在第一步中,我正在为命令日志记录命名一个服务,该服务将由进程用于向其发送日志。"local6"将是用于日志记录的服务的终点。 在第二步中,我正在设置实际上我想要的东西。"PROMPT_COMMAND='RETRN_VAL=$?"这部分将记录用户的输入,"logger -p local6.debug"将把日志文件发送到记录日志数据的服务,借助syslog进程的帮助。 - Mansur Ul Hasan

nhi将完美解决您的问题。该工具会自动捕获每个执行的命令(以及其输出)的所有潜在有用信息。
使用nhi,您可以轻松检索任何完整的shell会话(或终端输出),或者只检索您感兴趣的命令,通过nhi提供的高级查询机制。
注意:
我是这个工具的创建者。如果您有任何问题,请随时提问。

嗨 @strang1ato,你能否请添加关于如何安装和使用 nhi 工具的详细信息。谢谢。 - Jags
@Jags 请查看README - strang1ato
1这个回答和这里发布的回答是一样的,https://unix.stackexchange.com/a/677683/97255 和 https://unix.stackexchange.com/a/678401/97255。虽然你已经公开了关联,所以严格来说这不算垃圾邮件,但多次发布相同的回答还是有点奇怪的... - Greenonline
Nhi会允许我记录一个导致系统崩溃的会话吗,这样我就无法正常关闭记录过程了? - Rasmus
@Rasmus 我不确定你的意思,请你能否更准确地描述一下你的情况。 - strang1ato
@strang1ato,我已经解决了需要的情况。我的问题是GPU崩溃了,而我想在它崩溃时监控GPU温度。但这让我无法访问正在进行监控的终端,所以除非通过强制重启机器来终止进程,否则我将无法结束任何进程。 - Rasmus
@Rasmus nhi 通过一个进程将终端上的所有内容保存到数据库。 - strang1ato