2013-01-07 97 views
3

我一直在寻找一种方法来记录一些关于命令历史的更详细的信息。我的主要目的是为了在我们的应用程序中调试问题时创建粗略的服务器时间表,发布命令的大致日志。 这不是用于非常详细的审计目的。我遇到了this post,它提出了一个很好的方法来修改PROMPT_COMMAND以增加有关每个命令的附加信息的history日志。它建议添加以下到~/.bashrc文件:非交互式shell命令的历史

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 homehost条目为好,但由于这是不是通过PS1提示链接的解决方案做达不到。

我已经看了一下auditd。这是一个很好的实用工具,但细节的程度远远超出我的需要。我本可以很容易地解析日志,但是管道,重定向,循环变成了一场噩梦,可以合理地重建成类似于已经报告的东西。

回答

1

一个简单的包装ssh似乎是一个简单的方法来实现这一点。

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

或者,如果你想包装在本地运行,

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

我叫这个shout反对ssh它应该是,你知道的,安静。另见this。当然,如果你是管理员,你可以简单地将/usr/bin/ssh移动到某个模糊的地方,并强制你的用户运行一个/usr/local/bin/ssh,其内容类似于上面的内容。很容易绕过一个有知识的用户,但如果你真的很严厉,有办法让它变得更加困难。

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

#!/bin/bash 
echo "[email protected]" >>/home/root/im.in.ur.sh.reading.ur.seekrit.cmds.lol 
exec /bin/bash -c "[email protected]" 

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

+0

这需要每个人都发出远程命令来使用'喊'虽然,对吧?是否有基于主机的解决方案? – JaredC

+0

你可以在远程主机上用类似的东西包装登录shell。如果你绝望,你可能会破解远程'bash'或'sshd'来做日志记录。 – tripleee

+0

我对bash不太熟悉......是否有一些简单的指导可供参考? – JaredC