非交互式shell命令的历史记录

时间:2013-01-07 21:43:41

标签: bash

我一直在寻找一种方法来记录有关命令历史的更详细信息。我的主要目的是在调试应用程序问题时,为了构建粗略的服务器时间线而发布一个粗略的命令日志。 这不是用于高度详细的审核目的。我遇到了this post,它提出了一种很好的方法来修改PROMPT_COMMAND以增加history日志,并提供有关每个日志的更多信息命令。它建议在~/.bashrc文件中添加以下内容:

export PROMPT_COMMAND='hpwd=$(history 1); hpwd="${hpwd# *[0-9]*  }"; if [[ ${hpwd%% *} == "cd" ]]; then cwd=$OLDPWD; else cwd=$PWD; fi; hpwd="${hpwd% ### *} ### $cwd"; history -s "$hpwd"'

这很棒,但只有在发出PS1提示时才会发生。有没有办法增强这个以使用非交互式shell(我认为这是正确的术语)?

例如,我想:

ssh host "ls | grep home"

要在ls | grep home上为host创建条目,但由于这不是通过PS1提示进行的,因此链接的解决方案不足。

我稍微调查了auditd。这是一个很好的实用程序,但细节水平远远超出我的需要。我本可以很容易地解析日志,但是管道,重定向,循环变成了一个噩梦,可以很好地重建成history已经报告过的东西。

1 个答案:

答案 0 :(得分:1)

围绕ssh的简单包装似乎是实现这一目标的简单方法。

shout () {
    local host
    host=$1
    shift
    ssh "$host" <<____HERE
        echo "$@" >>\$HOME/.shout-history
        bash -c "$@"
____HERE
}

或者如果您希望包装器在本地运行,

shout () {
    local host
    host=$1
    shift
    echo "$@" >>$HOME/.shout-history
    ssh "$host" "$@"
}

我打电话给shout反对ssh这应该是,你知道,应该是安静的。另见this。当然,如果您是管理员,则只需将/usr/bin/ssh移至某个地方,并强制您的用户运行/usr/local/bin/ssh,其内容与上述类似。这很容易被知识渊博的用户绕过,但如果你真的很苛刻,就有办法让它变得更难。

如果您是远程主机的管理员,您可以强制所有用户运行/usr/local/bin/shout作为他们的shell,例如,并使用或多或少类似的东西填充它。

#!/bin/bash
echo "$@" >>/home/root/im.in.ur.sh.reading.ur.seekrit.cmds.lol
exec /bin/bash -c "$@"

只需确保成绩单文件是世界可写的,但不是世界可读的。