Korn Shell
配置思路和之前没有什么不同,只是有以下几点不同:
不同shell环境下的语法不同,具体写的时候要注意;
文中条件分支判断使用了case语句;
bash下的PROMPT_COMMAND变量在ksh下是不支持的,因此需要找到可以代替的,在这里使用了trap命令;
bash下获取输入命令使用了history命令,在ksh里不用了(不确定是否能用,时间太久已忘了),使用量的内置的命令fc来获取;
最终的配置如下:
修改/etc/profile文件。
vi /etc/profile
在文件最后加入以下内容,将其中的192.168.100.90替换为资源的IP。
# Add content in /etc/profile``# Log ksh user login and command history``case "$0" in``-ksh)
up_client_ip=`(who am i|cut -d\( -f2|cut -d\) -f1)`
if ( test -z "`echo $up_client_ip|awk '($1 ~/[0-9]+.[0-9]+.[0-9]+.[0-9]+/)'`")
then
up_client_ip=`awk'/'$up_client_ip'/ {print $1}' /etc/hosts`
fi
up_nowtime=`(date -d now +"%Y-%m-%d %T")`
logger -p user.notice -- class=\"HOST_LOGIN\"type=\"2\" time=\"$up_nowtime\" src_ip=\"$up_client_ip\" dst_ip=\"192.168.100.90\" primary_user=\"\" secondary_user=\"$(whoami)\" operation=\"\" content=\"login successful\" authen_status=\"Success\" log_level=\"1\" session_id=\"$$\" 2>/dev/null;
trap 'command=`(fc -ln -0)`;logger -p user.notice --class=\"HOST_COMMAND\" type=\"3\" time=\"$(date -d now+"%Y-%m-%d %T")\" src_ip=\"$up_client_ip\" dst_ip=\"192.168.100.90\" primary_user=\"\" secondary_user=\"$(whoami)\" operation=\"$command\" content=\"command\" authen_status=\"\" log_level=\"1\" sessionid=\"$$\" 2>/dev/null' DEBUG;
readonly up_client_ip
readonly up_nowtime
;;``*)
;;``esac
其中操作日志的记录配置如下:
trap 'command=`(fc -ln -0)`;logger -p user.notice --class=\"HOST_COMMAND\" type=\"3\" time=\"$(date -d now+"%Y-%m-%d %T")\" src_ip=\"$up_client_ip\" dst_ip=\"192.168.100.90\" primary_user=\"\" secondary_user=\"$(whoami)\" operation=\"$command\" content=\"command\" authen_status=\"\" log_level=\"1\" sessionid=\"$$\" 2>/dev/null' DEBUG;
trap命令
对于trap命令,官方释义如下:
语法格式如下:
格式:trap "commands" signals
当shell接收到signals指定的信号时,执行commands命令。
我们需要在用户输入命令回车后执行commands,trap提供了一种信号DEBUG,可以在脚本执行时打印调试信息,正好符合我们的需求。我们的commands内容即为:
'command=`(fc -ln -0)`;logger -p user.notice --class=\"HOST_COMMAND\" type=\"3\" time=\"$(date -d now+"%Y-%m-%d %T")\" src_ip=\"$up_client_ip\" dst_ip=\"192.168.100.90\" primary_user=\"\" secondary_user=\"$(whoami)\" operation=\"$command\" content=\"command\" authen_status=\"\" log_level=\"1\" sessionid=\"$$\" 2>/dev/null'
其中**command=`(fc -ln -0)`;**获取了命令值;然后使用logger产生日志,其中引用了command变量值。
fc命令
/usr/bin/fc
fc 实用程序用于列出、编辑或重新执行之前输入到交互式 sh 的命令。
注:
同登录日志一样,操作日志也需要考虑执行shell命令、su、su -切换后操作日志是否能记录的情况,Linux篇结束后统一发布测试的结果;
本文中我们选择了配置/etc/profile文件,bash中我们选择了/etc/bashrc文件,每个选择都是有理由的;