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

Linux 记录Bash交互,分别保存STDIN和STDOUT,linux,bash,shell,unix,interaction,Linux,Bash,Shell,Unix,Interaction,所以我想记录我的bash交互,我知道我可以用它,或者。除了我比他们更想要一个功能。分别保存输入(即标准输入)和输出(即标准输出) 比如(我在这里输入了第一个“Hello World!”),当然除了script需要一个[file]arg,而不是两个: user@pc:~$ script input.txt output.txt Script started user@pc:~$ paste > textfile.txt Hello World! user@pc:~$ cat textfile

所以我想记录我的bash交互,我知道我可以用它,或者。除了我比他们更想要一个功能。分别保存输入(即标准输入)和输出(即标准输出)

比如(我在这里输入了第一个“Hello World!”),当然除了
script
需要一个
[file]
arg,而不是两个:

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
因此,
input.txt
看起来像:

user@pc:~$ paste > textfile.txt
Hello World!
user@pc:~$ cat textfile.txt 
user@pc:~$ exit
Hello World!
exit
output.txt
看起来像:

user@pc:~$ paste > textfile.txt
Hello World!
user@pc:~$ cat textfile.txt 
user@pc:~$ exit
Hello World!
exit
所以我想要一个像
script
这样的程序,它分别保存STDIN和STDOUT。因为目前,这将是
脚本
的正常输出(我不想要,需要分开):

这是存在的,还是可能的

注意
paste
命令的用法,因为我考虑过根据
user@pc:~$
,但在我的情况下(与粘贴
一样),这不起作用。

为空 是为各种linux发行版打包的(在ubuntu上是
empty expect

  • 打开两个端子
  • 终端1:运行
    empty-f-i in.fifo-o out.fifo bash
  • 终端1:运行
    tee stdout.log-in.fifo
  • 终端2中键入命令,观察终端1中的输出
    • 使用isig-echo固定终端设置
    • 使用
      exec 2>stderr.log将stderr与stdout分开记录
    • 完成后,
      退出
      bash shell;两个
      tee
      命令都将退出
  • stdout.log
    stdin.log
    包含日志

  • 其他一些选择:

    peekfd 您可以尝试
    peekfd
    (属于
    psmisc
    包的一部分)。它可能需要以root用户身份运行:

    peekfd -c pid fd fd ... > logfile
    
    其中pid是要附加到的进程,
    -c
    表示也要附加到子进程,
    fd
    是要查看的文件描述符列表(基本上是
    0
    1
    2
    )。还有各种其他选项可以调整输出

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

    SystemTap和类似产品 此后,有人提议使用该工具。 然而,配置并不是一件小事,您仍然需要编写一个分离stdin和stdout的模块

    而且看起来很有趣

    LD_预加载/strace/ltrace 使用,可以包装低级调用,例如write(2)

    您可以在
    strace
    ltrace
    下运行shell,并记录传递给系统和库函数的数据(如write)。需要大量的后处理:

    ltrace -f -o ltrace.log -s 10000000000 -e write bash
    
    补丁ttyrec
    ttyrec.c只有500行相当简单的代码,使用多个日志文件进行修补似乎相当容易。

    如果您还想在
    input.txt
    中获得提示,请注意shell会将提示打印为标准错误,而且可能很难将提示符与其他程序写入标准错误的文本分开。您必须在stdin和shell之间放置一些东西。类似于
    cat | tee input.txt | sh-i | tee output.txt
    。单独保存stdin和stdout是很简单的(如果您想保持TTY属性,则需要稍微有点技巧,在这种情况下,您需要插入
    screen
    tmux
    等,但通常情况下:在每一侧放置一个
    tee
    ,就完成了)。在不丢失订单的情况下单独保存stdout和stderr是非常困难的(需要jhnc的答案或我的评论中讨论的工具类别)。仅供参考,我在这个网站上的sysdig上实现了一个密切相关的工具(明确跟踪stdout/stderr,保留订单);看见这里没有包含计时数据,但只保留原始的系统挖掘跟踪会有效果。@CharlesDuffy Nice。我放弃了systemtap,因为ubuntu的软件包不能很好地使用安全引导。没有遇到sysdig,但它提供注册一个新的MOK,所以我要重新启动并玩一个游戏…真棒的答案!所以我选择了最后一个选项,制作了一个补丁(用于脚本),虽然是以一种基本的方式。因此,它为不同的流输出特殊字符,然后将输出结果正则化为不同的文件。乱七八糟-但它奏效了!谢谢