如何将网络或用户源连接数据添加到历史记录条目?


8

我想为我管理的系统上的所有用户修改历史记录设置。我希望它包含来自连接终端的信息,例如来自who

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

我目前通过以下方式修改我的历史记录。我知道其中许多设置已在这里讨论过几次。但是,很久以前,我从“ Linux系统管理食谱:Juliet Kemp ”中提取了此代码。

shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T  "

shopt -s histappend 解决了当您有多个终端时打开的信息可能会丢失的问题。

PROMPT_COMMAND='history -n;history -a' 扩展以提供跨多个终端的实时历史记录。

HISTSIZE=100000 HISTFILESIZE=100000 延长history保留时间

HISTTIMEFORMAT="%m/%d/%y %T “在历史的每一行前都加上时间戳

您通常会得到什么 history

835  ls
836  cd ..

我修改的当前history结果

5853  03/26/12 07:16:49  ls
5854  03/26/12 07:16:50  ll

history我希望看到的回报

5853  03/26/12 07:16:49  sysadmin.doofus.local    ls
5854  03/26/12 07:16:50  sysadmin.doofus.local    ll

001  03/26/12 05:11:29  demo_user.doofus.local    cd
002  03/26/12 05:11:30  demo_user.doofus.local    ll

我没有“嫁给”这个DNS名字。我只希望它从那里who或其他位置拉出而无需执行任何形式的查找或查询。我对IP地址感到满意。

002  03/26/12 05:11:30  192.168.0.2    ll

为什么?我管理着几个系统,同一组的多个用户共享一个用户ID来执行其日常任务。这将使我能够将他们在组织中的真实位置和实际用户与他们在历史中所做的事情相关联。

我知道这不是最佳选择,而是要更改它,但是当您在船上时,只要不像邮轮那么大,就不要试图使发夹弯。(注意:当您这样做时,乘客会尝试将您扔到舷外)

无论如何,在我能够将它们迁移到更好的解决方案之前,我希望具有此跟踪功能。

另外,如果您对我目前用于history修改的内容有任何建议,也希望听听。

谢谢,

编辑:1

我不想运行其他程序,也不必“合理地”配置其他任何东西。

我要增加0开销,如果必须添加,则需要很小。

我确实相信我的用户(如果发生了什么),我希望看到说使用相同的user:password登录系统的10个用户中有哪个做到了。或者,可能不是用户,而是cron在作为用户执行某项操作的系统上被遗忘了。或一个应用程序Ex:BMC Control-M连接ssh并运行任务。寻找“坏用户”与其说是要花费最少的努力来对其进行追踪,不如说是在寻找。

编辑2:

系统正在运行SLES和RHEL


1
听起来像过程记帐可能很有用。外壳历史记录从未设计用于记录日志,如果要使用它,则必须信任所有用户。请参阅有关监视活动的相关问题相关答案
jw013 2012年

@ jw013感谢您的评论。但是,必须对其进行配置和管理,再加上我已阅读的信息,因此最好将目录/proc /dev和用户/home目录排除在外。这增加了开销。鉴于history已经记录了它们的连接信息,并且连接IP等系统知道它们的连接信息,因此...可以以这种方式设置该信息(如果尚未“静态”可用)或将其存储在变量或文件中,并输入到history记录和性能命中中会非常小或0
2BC

如果是在Linux上,请考虑使用auditd。我不确定它的日志是否能为您提供足够的信息。您想要的困难恰恰是为什么共享帐户如此被拒绝。
吉尔(Gilles)'所以

它是在Linux上,我将编辑我的问题以使其清楚。auditd就像inotify您必须告诉它要监视哪些更改。单个文件,目录等。我不想进行这种配置。实际上(我知道),但本质上不在乎。我必须puppet处理这些东西。auditd以及额外的负载和设置时间。如果某个帐户正在修改某些内容,我仍然想回顾一下历史记录,看看谁在登录或尝试登录。
2bc 2012年

2
hm,因为PROMPT_COMMAND=只是在下一个提示符之前运行普通命令,所以您不能编写一个在历史文件的最后一行工作的,用于调用sed / awk的函数以添加信息。然后调用该函数PROMPT_COMMAND=以追加数据?这会有点骇人听闻,但应该做好。
llua 2012年

Answers:


1

根据llua的建议,我们可以在历史上做更多的工作。在系统范围内的BASH RC文件(可能是/etc/bash.bashrc)中添加一行。

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

在系统记录器中为“ local6”设置记录。也许是这样的:

local6.*    /var/log/commands.log

重新启动系统记录器。也许设置日志文件轮换。登出; 登录; 并且,历史记录现在以如下格式写入/var/log/commands.log:

日期时间主机名记录器:用户名[audit_pid]:命令[return_val]

这可以进一步调整以品尝。


1

以下几段将对这一思想进行总体描述,但在某些方面已经过时了,但是您可以在页面中使用最新的内容。让我们使用一个大文件〜/ .bash_history.archive(与HISTFILE =〜/ .bash_history分开)。然后在每个bash会话退出时,向其添加新的历史记录行。

这种方法的第一个问题是:如何使bash在每个出口上调用此脚本?当然,如果您通过键入'exit'退出它,则可以为'exit'函数加上别名,但是我为此使用了快捷键Ctrl-D,但是找不到如何将其重新分配给某些东西的方法,但是找不到内置的exit函数。

因此,第一个尝试是:禁止Ctrl-D

export IGNOREEOF=10

并定义双重Ctrl-X组合键以调用退出功能。

但是正确的方法是使用bash的退出流氓,这是一个完美的解决方案,因为无论退出bash的方式如何,它都会被调用:Ctrl-D,退出,关闭xterm窗口。

trap 'archive_history' EXIT

下一步是在bash_history中定义一条起始行,以便我们仅保存新行并确保将其追加到历史文件中。

export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`

shopt -s cmdhist histappend

这就是bash开始时所需的全部-现在我们知道当前(新)历史记录从哪个历史记录行开始。要保存历史记录,请将下一部分添加到您的〜/ .bashrc中。

archive_history()
{
    HISTORYOLD=${HISTFILE}.archive
    CURTIME=`date`
    CURTTY=`tty`
    if  [ x$HISTDUMPPED = x ]; then
      echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >>   $HISTORYOLD

      history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g'  >> $HISTORYOLD
      export HISTDUMPPED=1
    fi
}

exit ()
{
   archive_history
   builtin exit

}

文件〜/ .inputrc应该包含下几行,以将退出快捷方式重新定义为Ctrl-x x。第一次尝试时,您可能会觉得这是可怕的捷径,但后来您习惯了-相信我。

$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"

$endif

另外,如果您的bash会话是登录会话,并且您通过调用“ logout” 退出,则可以将下一行添加到~/.bash_logout

archive_history

完成上述所有操作后,您可以找到~/.bash_history.archive包含以下部分的文件

#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----

exit
cd progr/letters/resume/
e resume.tex

如果需要,通常可以将其作为常规历史文件读取。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.