所以我想记录我的bash交互,我知道我可以使用script或ttyrec来进行交互。除了我要比他们拥有更多的功能。分别保存输入(即STDIN)和输出(即STDOUT)。
除了(script
需要一个[file]
arg,而不是两个参数之外,类似(我在其中键入了第一个“ Hello World!”)的东西:
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
output.txt
如下:
Hello World!
exit
所以我想要一个像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
这是否存在,或者这可能吗?
请注意paste
命令的用法,因为我曾考虑过基于user@pc:~$
过滤输出文件,但是在我的情况下(与paste
一样)。
答案 0 :(得分:3)
empty被打包用于各种linux发行版(在ubuntu上是empty-expect
)。
empty -f -i in.fifo -o out.fifo bash
tee stdout.log <out.fifo
stty -icanon -isig eol \001; tee stdin.log >in.fifo
stty icanon isig -echo
修复终端设置exec 2>stderr.log
将stderr与stdout分开记录exit
bash shell;这两个tee
命令都将退出stdout.log
和stdin.log
包含日志其他一些选择:
您可以尝试peekfd
(属于psmisc
软件包的一部分)。它可能需要以root身份运行:
peekfd -c pid fd fd ... > logfile
其中pid是要附加的过程,-c
表示也要附加到子级,而fd
是要观察的文件描述符列表(基本上是0
,1
,2
)。还有许多其他选项可调整输出。
日志文件将需要进行后期处理以满足您的要求。
在unix stackexchange上,已经建议使用SystemTap工具。 但是,配置并非易事,您仍然必须编写一个将stdin和stdout分开的模块。
使用LD_PRELOAD,可以包装低级调用,例如write(2)。
您可以在strace
或ltrace
下运行shell,并记录传递给系统和库函数(例如write)的数据。需要大量的后处理:
ltrace -f -o ltrace.log -s 10000000000 -e write bash
ttyrec.c只有500行相当简单的代码,看起来很容易打补丁以使用多个日志文件。