3

我一直在寻找一种方法来记录有关命令历史的一些更详细的信息。我的主要目的是粗略记录发出的命令,以便在调试我们的应用程序问题时构建粗略的服务器时间表。 它不是用于非常详细的审计目的。 我遇到了这篇文章,它提出了一种很好的修改方法,以使用有关每个命令的附加信息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发出提示时发生。有没有办法增强它以使用非交互式外壳(我认为这是正确的术语)?

例如,我想:

ssh host "ls | grep home"

要为ls | grep homeon创建一个条目host,但由于这不是通过PS1提示完成的,因此链接的解决方案不足。

我调查auditd了一下。这是一个很棒的实用程序,但详细程度超出了我的需要。我本可以很容易地解析日志,但是管道、重定向、循环变成了一场噩梦,无法理智地重建成与history已经报告的内容非常相似的东西。

4

1 回答 1

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它应该,你知道,安静。另请参阅。当然,如果您是管理员,您可以简单地移动/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 "$@"

只要确保脚本文件是世界可写的,但不是世界可读的。

于 2013-01-07T21:59:28.723 回答