Linux 记录Bash交互,分别保存STDIN和STDOUT
所以我想记录我的bash交互,我知道我可以用它,或者。除了我比他们更想要一个功能。分别保存输入(即标准输入)和输出(即标准输出) 比如(我在这里输入了第一个“Hello World!”),当然除了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
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,所以我要重新启动并玩一个游戏…真棒的答案!所以我选择了最后一个选项,制作了一个补丁(用于脚本),虽然是以一种基本的方式。因此,它为不同的流输出特殊字符,然后将输出结果正则化为不同的文件。乱七八糟-但它奏效了!谢谢