C Shell
以下几点:
C Shell的语法(每个shell都有不同),比如设置只读变量用了set -r;
bash下我们用了PROMPT_COMMAND变量,ksh下我们用了trap,C shell下不支持PROMPT_COMMAND变量,我们使用了c shell下的内置变量precmd。C shell下对于trap是否支持,没有进行测试。
使用了别名alias。
最终配置如下:
修改/etc/csh.cshrc文件。
vi /etc/csh.cshrc
在文件最后加入以下内容,将其中的192.168.100.90替换为资源的IP。
# Add content in /etc/csh.cshrc
以上在记录登录日志的时候作了判断,保证了当用户使用tcsh、csh命令切换shell的时候不会记录登录日志。
其中操作日志的记录配置如下:
alias precmd '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=\"`history 1 | cut-f3-`\" content=\"command\" authen_status=\"\"log_level=\"1\" session_id=\"$$\" >/dev/null'
precmd
precmd Runs just before each prompt is printed. For example, if one does
> alias precmd date
then date(1) runs just before the shell prompts for each command. There are no limits on what precmd can be set to do, but discretion should be used.
在命令行提示符出现前会先执行precmd定义的命令,这样也就满足了我们的要求,在回车后会执行我们定义的产生日志的命令。C shell下类似的命令还有postcmd,感兴趣的可自行研究。
一个遗留问题:
precmd我们使用了别名alias,但是用户可以使用unlias来删除别名,这样操作日志将不会被记录。关于如何设置用户不能取消alias,之前咨询了一些人,有给出一些方法,但都不是完全的方法(执行一些命令就可逸出),后续也搁置了。
至此,Linux下bash(sh)、ksh、tcsh(csh)环境下的登录日志、操作日志的配置方法已全部写完。后续发布:
Linux系统下各个shell的启动文件;
Linux下操作日志实现方法(PROMPT_COMMAND、trap、trap函数、precmd)的测试结果;
Linux下登录日志、操作日志在登录、执行shell命令、su切换、su -切换场景下的测试结果;