基本的一些概念:
1)syslog的日志为8个等级,从0到7,详细的信息,man syslog就可以了.默认是info.
2)我们的系统日志在/var/log/下面,像messages,secure等等,这里要说明的,不是你有操作,系统就会将其写入到对映的日志里也就是说想写日志信息到里面,只能通过syslog系统函数.3)syslog日志系统提供远程日志写入功能,即A机器开放syslog的服务,并开放远程syslog功能,B机器可以将自己的日志信息写入到A机器的日志系统4)syslog提供facility使用户自定义的来操纵程序写日志. 特殊玩法:1)如何将消息写入到syslog的日志系统?
可以用logger命令,syslog的日志等级有8个,默认是info,这时你用logger为debug(最低)来写日志,syslog服务是不会写日志的.比如:
cat /etc/syslog.conf*.info;mail.none;authpriv.none;cron.none /var/log/messages [root@umail180 etc]# logger -p debug "hello this is a test"-p选项来指定优先级,logger的默认优先为是info.指定info或更高的优先级都可以被syslog所接收.
*.info;mail.none;authpriv.none;cron.none这里的*表示所有的facility,而none表示对映的facility不被接收
2)如何将命令的执行结果写入到syslog的日志系统?
可以用initlog命令.例如:initlog -c "cat /etc/passwd"-c选项后面要指定command
这时会把cat /etc/passwd的结果写入到/var/log/message.其中initlog在sysinit中就有调用,它记录了整个sysinit脚本的启动引导过程,这样我们才会在messages里看到它的引导信息 3)实现syslog的远程写日志功能.服务端:
这里要打开/etc/sysconfig/syslog文件更改SYSLOGD_OPTIONS="-m 0"
为SYSLOGD_OPTIONS="-m 0 -r " 重启syslog服务即可,注意更改/etc/sysconfig/syslog和/etc/syslog都要重启syslog服务,因为/etc/init.d/syslog脚本在启动时要加载这两个文件.默认是开放514的udp端口
netstat -anp|grep syslogudp 0 0 0.0.0.0:514 0.0.0.0:* 3425/syslogd 客户端:vi /etc/syslog.conf增加一条策略,如下:*.info @umail180这里的*代表所有的facility,也就是说所有的级别为info的写日志操作都将写入到远程的umail180服务器,这里的umail180是主机名有两点要重点说明:第一点,写本地syslog,和写远程的syslog是两回事,相互不影响例如: 你有两条策略:*.info /var/log/messages*.info @umail180它是即写/var/log/messages,又写umail180的syslog 说明 :系统是先接收到recv请求, 再去写文件,然后调用fsync同步内存到磁盘.最后它调用sendto函数发送到umail180这台服务器的514端口这时在服务端会收到请求.并写到syslog指定facility的文件中.
第二点,syslog的服务端收到请求,会根据facility将信息写到对映的文件中,这样有利于信息的汇集和管理
例如:在其它服务器登录这台客户端当然这时本地的syslog会收到请求,会根据syslog.conf文件的facility将信息写入到/var/log/secure中.
而如果你有也想将信息写入到远程服务器,例如采用下面的配置:authpriv.* /var/log/secure*.info @umail180同样远程服务器将收到本地syslog的sendto请求,它将跟据请求的facility,写入的对映的文件中.比如/var/log/secure
这时在远程的/var/log/secure中也记录了一份登录客户端的日志信息. 4)想记录那些鸟人在我服务器上的所有操作,可以用syslog实现吗?答案是可以的.但要说明白似乎要走些弯弯.首先并不是所有的操作都会写入到日志中,即使你把级别调到最高也是如此问题就在于,真正涉及到写syslog的日志的操作,只能是调用syslog函数,而调用syslog函数的命令我们刚才见到两个,logger和initlog它们各有用处.像ls和cp这种命令是不会调用syslog函数,所以即使你将级别调整到debug,也是无用的.那好.如何解决上面的问题,先说initlog,我在不调用initlog的情况下,能用syslog记录它的运行结果吗?
这样就可以.
initlog -c /bin/bash这时/var/log/message就记录下它操作的结果.如果是rpm -qa,那就会有一大批的信息.
但遗憾的是,它会丢了PROMPT.就是PS1那一大堆东西.但所有的命令都有效.再来说说logger.这里有一点要区分,logger只是写信息到syslog的日志中,它是不执行那些信息的.
这里要执行命令,也要将命令写到syslog中,再根据syslog的远程功能,发送到远端的syslog服务器.在日志中将是这样的结果:Jun 2 16:12:52 umail180 bash[24371]: ls --color=tty -lJun 2 16:13:30 umail180 bash[24371]: hackerJun 2 16:13:40 umail180 bash[24371]: ls --color=ttyJun 2 16:13:43 umail180 bash[24371]: cd /usr/src/Jun 2 16:13:43 umail180 bash[24371]: ls --color=ttyJun 2 16:13:46 umail180 bash[24371]: cd redhat/Jun 2 16:13:47 umail180 bash[24371]: ls --color=ttyJun 2 16:28:11 umail180 bash[24371]: cd SOURCES/Jun 2 16:28:11 umail180 bash[24371]: ls --color=ttyJun 2 16:28:13 umail180 bash[24371]: ifconfig eth0Jun 2 16:28:14 umail180 bash[24371]: ls --color=ttyJun 2 16:28:15 umail180 bash[24371]: clear 这里要改下bash的源程序:简单说下bash的运行流程:主程序文件是shell.c,它会做一些profile中的设定,包括PS1等等,最后它会运行eval.c中的reader_loop函数,这个函数接收这些操作指令.再调用execute_command函数执行之,当然它后面非常复杂,这里只要把这些指令接收进来,再调用syslog函数写到syslog服务的日志中就OK了.至于后面怎么执行,那不是我们关心的.我改了两个地方:
eval.c中的reader_loop函数,大概在143行插入了:print_to_syslog(current_command);print_to_syslog是我自定义的函数.这个函数,我加到了print_cmd.c源程序中.如下:print_to_syslog(command) COMMAND *command;{ command_string_index = 0; openlog ("bash", LOG_PID, LOG_LOCAL5); syslog (LOG_INFO, "%s\n", make_command_string(command)); closelog();}这里的openlog的LOG_LOCAL5是facility,这个是在syslog.conf中自定义的.
这里的syslog是系统函数,所以要在print_cmd.c文件中加入头文件syslog.h.把bash的源程序再./configure;make;make install就行了.
最后把想要监控的用户的bash指定到新的bash文件就可以了. 例如在 syslog.conf中添加下面的样子:local5.* @umail180在远端的syslog服务器中添加和上面对映的就行了.
local5.* /var/log/operator
呵呵.这样你就可以坐在电脑前看着/var/log/operator,欣赏所有服务器上操作者的表演了.
有关于概念上的学习,man查看下syslog和syslog.conf,还有 openlog这些都是很有用的.