记录 Bash 交互,分别保存 STDIN、STDOUT

pto*_*my0 4 unix linux bash shell interaction

所以我想记录我的 bash 交互,我知道我可以用scriptttyrec 来做。除了我想要的功能比他们多。分别保存输入(即STDIN)和输出(即STDOUT)。

所以就像(我输入第一个“Hello World!”的地方),除了当然script需要一个[file]参数,而不是两个:

user@pc:~$ script input.txt output.txt
Script started
user@pc:~$ paste > textfile.txt
Hello World!
user@pc:~$ cat textfile.txt 
Hello World!
user@pc:~$ exit
Script done
Run Code Online (Sandbox Code Playgroud)

所以input.txt看起来像:

user@pc:~$ paste > textfile.txt
Hello World!
user@pc:~$ cat textfile.txt 
user@pc:~$ exit
Run Code Online (Sandbox Code Playgroud)

output.txt看起来像:

Hello World!
exit
Run Code Online (Sandbox Code Playgroud)

所以我想要一个程序script,它可以分别保存 STDIN 和 STDOUT。由于目前,这将是script(我不想要的,需要分开的)的正常输出:

Script started

user@pc:~$ paste > textfile.txt
Hello World!
user@pc:~$ cat textfile.txt 
Hello World!
user@pc:~$ exit
exit

Script done
Run Code Online (Sandbox Code Playgroud)

这是否存在,或者这可能吗?

请注意pastecommand的用法,因为我曾考虑过基于 过滤输出文件user@pc:~$,但在我的情况下(与 一样paste)这行不通。

jhn*_*hnc 5

空的

empty为各种 linux 发行版打包(它empty-expect在 ubuntu 上)。

  1. 打开两个终端
  2. 终端1:运行empty -f -i in.fifo -o out.fifo bash
  3. 终端1:运行tee stdout.log <out.fifo
  4. 终端2:运行stty -icanon -isig eol \001; tee stdin.log >in.fifo
  5. 终端 2 中输入命令,观察终端 1的输出
    • 修复终端设置 stty icanon isig -echo
    • 与标准输出分开记录标准错误 exec 2>stderr.log
    • 完成后,exitbash shell;两个tee命令都会退出
  6. stdout.logstdin.log包含日志

其他一些选择:

偷看

你可以试试peekfdpsmisc包的一部分)。它可能需要以 root 身份运行:

peekfd -c pid fd fd ... > logfile
Run Code Online (Sandbox Code Playgroud)

其中 pid 是要附加到的进程,也-c说要附加到子进程,并且fd是要监视的文件描述符列表(基本上是0, 1, 2)。还有各种其他选项可以调整输出。

日志文件需要进行后处理以符合您的要求。

SystemTap 和类似的

unix stackexchange上,有人提议使用SystemTap工具。但是,配置起来并不容易,您仍然需要编写一个将 stdin 和 stdout 分开的模块。

sysdigbpftrace看起来也很有趣。

LD_PRELOAD / strace / ltrace

使用LD_PRELOAD,您可以包装低级调用,例如 write(2)。

您可以在strace或下运行您的外壳程序ltrace并记录传递给系统和库函数(例如写入)的数据。需要大量的后处理:

ltrace -f -o ltrace.log -s 10000000000 -e write bash
Run Code Online (Sandbox Code Playgroud)

补丁ttyrec

ttyrec.c 只有 500 行相当简单的代码,看起来很容易修补以使用多个日志文件。