非交互式Shell命令的历史

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提示符时才会生效。有没有办法让它适用于非交互式的shell(我想这应该是正确的术语)?
例如,我想要:
ssh host "ls | grep home"

为了在host上创建一个与ls | grep home相同的条目,但由于这不是通过PS1提示完成的,所以所链接的解决方案存在缺陷。
我稍微研究了一下auditd。它是一个很好的实用工具,但详细程度远超出我的需要。我可以轻松地解析日志,但管道、重定向和循环成为了一个噩梦,要让它们变成像history报告的那样美观,就会变得非常复杂。
2个回答

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 "$@"

请确保转录文件具有全球可写但不可读的权限。


这需要每个远程发出命令的人都使用 shout,对吗?有基于主机的解决方案吗? - JaredC
你可以在远程主机上使用类似的方法包装登录 shell。如果情况紧急,你可以黑掉远程的 bashsshd 来进行日志记录。 - tripleee
我对bash不是很熟悉...你能给一些简单的指导吗? - JaredC
稍微更新了答案。 - tripleee
我需要使用 exec /bin/bash $@,最终我为特定用户制作了一个特殊的 shell。 - JaredC

1

看看SSHLog - 这似乎是你要找的:https://github.com/sshlog/agent/

我是这个项目的代码贡献者。

它监视SSH会话并报告每个会话和它们运行的所有命令。退出代码和命令输出也可用。

默认情况下,它将写入日志文件,但它是可配置的,并具有远程syslog、slack警报、电子邮件等插件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接