Linux综合命令行的历史

我有Ubuntu服务器。 在服务器上允许多个用户进行操作。 他们使用ssh。

我需要在一个地方显示时间,用户和命令的所有命令行历史logging。 另外我想阻止用户编辑历史文件。 一般来说,我需要logging他们在服务器上做什么,并防止他们修改logging。

有没有解决scheme?

我相信应该是可以的。 我会开始为每个用户创build一个日志文件(因为我不确定共享历史logging文件的副作用)。 所以为了举例,我要去

 mkdir /var/log/history touch /var/log/history/soneil chown root:soneil /var/log/history/soneil chmod 660 /var/log/history/soneil 

所以我有一个由root拥有的历史文件,但'soneil'可以写入。

然后,有点神奇: chattr +a /var/log/history/soneil

现在“索尼”只能追溯到历史,否则对于除根之外的一切都是不可改变的。

所以我已经准备好了我的日志文件,我只需要使用它。

在/ etc / bashrc(在Ubuntu上我注意到这是/etc/bash.bashrc):

 export HISTFILE=/var/log/history/$USER readonly HISTSIZE readonly HISTFILE readonly HISTIGNORE readonly HISTCONTROL 

只读的内置是相当不言自明的,我相信也可以同样适用于SvenW的function。

经过testing,这与正常的历史文件有相同的问题; 它在注销时写入,并没有时间戳。 所以sorting事件会很混乱。 我想如果我必须自己做,我会补充

 PROMPT_COMMAND="history -a;$PROMPT_COMMAND" readonly PROMPT_COMMAND 

在每次绘制新的提示时强制将历史刷新到磁盘。 还有一个HISTTIMEFORMAT envar,它将为历史文件添加时间戳,但是格式非常漂亮(将var设置为更漂亮的格式只影响'history'的输出,而不影响文件本身的内容)。

我认为你想要做的事情是不可能的。 你主要担心谁更改了一个文件,或者你明确地想要看看他们使用pico这样做吗? 如果前者是这种情况,那么可以使用具有日志loggingfunction的共享文件系统(即NFS,Samba),并以这种方式挂载用户目录。 根据configuration,这将logging每个文件操作。

—编辑

再想一想,我猜你可以使用陷阱来做你想做的事情,但这是一个骇人听闻的解决scheme,并会阻止一些bashfunction:

将以下内容放在/etc/bashrc (或类似的)中:

 function commandlogger { LASTENTRY=$(fc -ln -0) logger -p local1.info -t commandlogger -i -- "${USER} - ${LASTENTRY}" } trap commandlogger DEBUG 

每当用户input一条命令,这个命令就会popup一个bash陷阱,然后将这个命令logging到系统日志中。 然后你可以通过这个寻找标签commandloggergrep 。 此外,只有在下一个命令之后才会logging条目。

正如Khaled所说,处理这个问题的最好办法不是让许多人使用sshlogin到同一个帐户,而是让每个用户拥有自己的login名,并通过使用共享权限的单个命令来获得特权帐户。

如果你这样做,不仅sudo使用sysloglogin到系统日志,但是如果你需要一个明确的防篡改logging谁做了什么,你可以让这些syslog也发送到一个中央日志主机,没有任何用户有任何访问权限。

编辑 :我只是试图通过启用进程记帐来做到这一点,虽然这给了我每个用户运行的每个命令的确定列表,但它似乎没有logging参数和标志,只有命令本身。 任何人都知道任何方式让lastcomm报告参数和标志?