记录所有终端输入/输出历史记录

记录所有终端输入/输出历史记录

Hyper-V VM 上的 Ubuntu 20.04

我正在尝试做类似的事情写在这个答案里。我认为这个答案将所有终端记录到某个文件中。如果可能的话,我希望能够按天记录我的所有终端输入/输出。这样当我想知道我在某一天做了什么时,我可以转到那一天的日志文件并读取我的终端的输入/输出。

答案1

我不知道您是否可以在服务器机器上安装软件,但 ZSH 和 FISH(BASH shell 的替代品)在其历史文件中存储每个运行命令的时间戳。ZSH 按行存储,FISH 每条命令存储两行。两者都使用 Unix 时间戳。 :1591635588:0;ssh 用户@服务器 ls /tmp 989 - cmd: ssh user@server ls /tmp 990 时间: 1591387835

我使用安装了 oh-my-zsh 的 ZSH 而不是 bash。ZSH 的历史记录文件 (~/.zsh_history) 将每个命令(行)存储为 bash,但将运行该命令时的 Linux 时间戳放在开头。要将历史记录保留在您这边(客户端),您可以通过 ssh 运行该命令:

$~> ssh user@server ls /tmp
$~> ssh user@server cat /etc/os-release

在 ZSH 上它的存储方式如下:

$~> cat ~/.zsh_history
: 1591635588:0;ssh user@server ls /tmp
: 1591636831:0;ssh user@server cat /etc/os-release

如果对该文件运行 AWK,则可以翻译时间戳:

$~> awk -F":" '{print strftime("%Y-%m-%d %H\:%M\:%S", $2),$3}' ~/.zsh_history 
2020-06-08 14:49:10 0;ssh user@server ls /tmp
2020-06-08 14:50:04 0;ssh user@server cat /etc/os-release

例如,您可以结合使用 grep 按日期进行过滤,并将其发送到文件:

$~> awk -F":" '{print strftime("%Y-%m-%d %H:%M:%S", $2),$3}' ~/.zsh_history \
| grep -E "2020-06-08" > ${HOME}/2020-06-08-history.log

相关内容