debian如何实现自动记录bash输入输出的日志

.bash_history文件只会记录bash的输入记录
而script命令是启动一个新的bash会话,不好实现登入用户时自动记录bash的日志
请问有什么别的方法能实现这一点?

.bashrc加入一行:

bash -i | tee out.txt

这样应该符合你的要求了,但有一个缺点是无法显示颜色了,因为这里启动的 bash 的标准输出流不是终端。

不过恕我直言,这基本上是一个伪需求,因为如你所说,.bash_history已经记录了历史输入了,得到了输入基本上也就知道输出是什么了。

不同情况下输入同一个命令可能有不同的输出结果,就好比date命令

你把 script 弄到 bash 初始化脚本里,或者用作用户的 shell 就行了(注意不要递归调用)。

script 命令添加到初始化脚本也许还需要注意当前是否为交互模式:

An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to terminals (as determined by isatty(3)), or one started with the -i option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.

具体需要怎么操作,如果直接放到.bashrc里的话就会死循环了

也许:

if [ -z "$ALLREADY_RUNNING_SCRIPT" ]; then
    export ALLREADY_RUNNING_SCRIPT=true
    # 初始化 script 
fi

script初始化好像会创建一个新的shell?

应该是这样吧?script 的工作原理是创建了一个伪终端用于拷贝输入输出。

是。


我注意到 man script 里提到有关避免递归的内容:

It is not recommended to run script in non-interactive shells.
The inner shell of script is always interactive, and this could
lead to unexpected results. If you use script in the shell
initialization file, you have to avoid entering an infinite loop.
You can use for example the .profile file, which is read by login
shells only:

       if test -t 0 ; then
           script
           exit
       fi

https://man7.org/linux/man-pages/man1/script.1.html


这个软件(script)的名字简直绝了,根本没法进行有效搜索…


更新:使用 script(1) 作为搜索关键字

1 个赞

我将这些放入.bashrc内似乎还是会一直循环
使用script命令后它会再启动一个bash,这样又会运行一遍.bashrc,这就导致无限循环

       if test -t 0 ; then
           script
           exit
       fi

我又仔细阅读了一下,好像是要将其放入/etc/profile文件中,目前似乎能正常运作了

$HOME/.profile 应该也可以

亲测有效:)

似乎发现了个小问题,在使用script的情况下who -m就失效了。

我又查询了一下,似乎 auditd 工具可以实现?目前还没找到具体方法

如果你需要记录输出,那么没有什么好办法,auditd 也无法实现,而且会严重增加你的日志体积,不过如果你需要的话:

如果不需要记录输出只需要记录命令,那 history 工作的也不错,为什么不用 history?