保存所有命令和所有输出(跨终端使用脚本)

保存所有命令和所有输出(跨终端使用脚本)

我想在短时间内保存命令历史记录和输出我在打开的任何终端中运行的每个命令。它们都应该放在同一个文件中。

所以基本上我想运行一个命令(或编辑 bashrc),这样我就可以;

  • 打开终端#1并运行echo hello
  • 打开终端#2并输入ls
  • 关闭终端 #1 并打开终端 #3 并输入whoami
  • 关闭所有终端。打开终端 #4,输入一个命令,查看按上述顺序运行的所有命令(echo hellolswhoami),以及它们的输出(按照我运行命令的顺序)。

理论上我可以打开每个终端并输入

screen -f output.txt

进而

exit

在关闭每个终端之前,但我不想每次都记住输入这些内容。我只希望它自动完成,直到我手动停止它(通过运行命令或更新bashrc)。

在声明该问题重复之前,请仔细阅读该问题。我搜索了现有问题,但未找到等效问题(尽管我可能错过了)。

答案1

潜在解决方案

经过一些研究和实验,我得出了以下结论:

logstuff(){

    while true; do

        case $1 in
            "on" ) exec > >( ( printf ">>>>> TIME:$(date) SHELLPID:$$;\n"; tee /dev/tty ; printf ">>>>>\n" ) >> logfile.txt) 2>&1 ;
                   break;;
            "off") exec > /dev/tty 2>&1 ;
                   break;;
                *) echo "Please type 'on' or 'off';;
        esac
    done
}

这个 bash 函数应该放在你的 中,~/.bashrc在打开新终端或发出 后即可使用。必须通过和参数source ~/.bashrc手动打开日志记录。onoff


演示

实际情况如下:

在 shell 1 中执行以下操作:

<shell 1>$ logstuff on
<shell 1>$ stat /etc/passwd
  File: /etc/passwd
  Size: 2208            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 156236      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-12-01 20:24:02.620000000 +0000
Modify: 2018-10-31 01:33:42.701000999 +0000
Change: 2018-10-31 01:33:42.704998999 +0000
 Birth: -
<shell 1>$ logstuff off
<shell 1>$ 

在 shell 2 中执行以下操作:

< shell 2 >$ logstuff on
< shell 2 >$ echo "Hello World !"
Hello World !
< shell 2 >$ logstuff off
< shell 2 >$ 

现在回顾一下logfile.txt

<shell 1>$ cat logfile.txt 
>>>>> TIME:Sat Dec  1 21:43:00 UTC 2018 SHELLPID:2225;
<shell 1>$ stat /etc/passwd
  File: /etc/passwd
  Size: 2208            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 156236      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-12-01 20:24:02.620000000 +0000
Modify: 2018-10-31 01:33:42.701000999 +0000
Change: 2018-10-31 01:33:42.704998999 +0000
 Birth: -
<shell 1>$ >>>>> TIME:Sat Dec  1 21:43:11 UTC 2018 SHELLPID:2359;
< shell 2 >$ echo "Hello World !"
Hello World !
< shell 2 >$ logstuff off
>>>>>
logstuff off
>>>>>
<shell 1>$ 

问题

  • 如果logstuff on先在两个终端上发出,则输出可能会混杂在一起。其工作方式是,您必须logsutff on在 shell 1 中发出,然后在那里发出命令,然后logstuff on在 shell 2 中发出。
  • 这使用了进程替换>( )tee子 shell。由于大量的分叉和额外的管道,它不是最优雅和最高效的。
  • logfile.txt存储在当前工作目录中。应将其更改为~/logfile.txt或用户认为合适的其他任何内容。

实际考虑

问题本身问的有点不切实际:将多个 shell 的输出存储到一个文件中意味着你存储了两个或多个完全不相关的会话的命令输出,这些会话可能具有不同的环境变量、不同的工作目录或在不同的文件系统上工作;这意味着如果你打算使用这样的日志文本进行调试或解决问题,就会缺少很多上下文。

更好的方法是将script -f日志文件写入一个特定目录中,这些日志文件的文件名可能带有时间戳或附加了 shell PID。另一个解决方案 - 不用有 3 个不同的终端,只需使用一个 -screen或我个人最喜欢的byobu-screen。您可以在屏幕上附加/分离单个虚拟 tty 会话它通常用于保持远程服务器上的进程运行,在这些服务器上,您必须注销但仍需要运行输出和回溯的 shell 会话。这script也可以与 结合使用。

相关内容