我一直在寻找一种方法来记录有关命令历史的更详细信息。我的主要目的是在调试应用程序问题时,为了构建粗略的服务器时间线而发布一个粗略的命令日志。 这不是用于高度详细的审核目的。我遇到了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
已经报告过的东西。
答案 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 "$@"
只需确保成绩单文件是世界可写的,但不是世界可读的。