用QQ管理你的系統
2005-7-24 by wwy
#########################
看過abel大哥的帖子--Shell/Web下發送MSN Message 很受啟發
http://bbs.chinaunix.net/forum/24/050711/575520.html
是利用一個基于命令行的msn客戶端實現的
在這里,換個角度,同樣可以利用Linux下命令行QQ客戶端 --- TestQQ來實現對系統的管理
管理員通過自己的QQ與服務端的QQ進行交流,服務器后臺用TestQQ+expect+bash 就可以實現很多有趣的功能了
TestQQ下載地址:http://formalin14.org/blog/static.php?page=tq
還要有兩個OICQ號碼,并互相加為好友(一個放在服務端,一個在管理員端)
關于TestQQ的使用方法在 http://formalin14.org 有說明,
其中在配置文件config.ini 中設置好掛在服務端的QQ號,密碼和是否隱身等信息
實現起來可以有兩種考慮,
第一種是以shell腳本為主,即讓shell腳本在系統后臺監控,當滿足一些條件時,調用expect腳本來控制TestQQ,向管理員發特定的消息,發完以后,服務端的QQ就退出;
比如,1.sh腳本用于檢測系統的登陸人數,當登陸人數大于0時,調用1.exp腳本,將who命令的結果發給管理員的QQ
簡單的舉例:
代碼: |
#!/bin/bash #flie_name 1.sh if [ `who | wc -l` -gt 0 ];then ./1.exp #同目錄下的exp腳本 fi |
代碼: |
#!/usr/bin/expect #file_name 1.exp set QQnum 165165984 #管理員端的QQ號 set run /home/wwy/TextQQ/TextQQ.sh #TextQQ的執行文件 #----------- spawn $run sleep 1 expect "*" sleep 3 #如果網速慢,可以加大這些sleep expect "*" sleep 3 expect "*" sleep 3 expect "*" sleep 5 #----------- send "/msg $QQnum Ready_at_[exec date +%D--%R]\r" send "[exec who | xargs]\r" #who命令后用到了xargs,是因為TextQQ不支持換行的原因,在這里 "who | xargs" 可以換成其他腳本或命令,來實現更復雜的功能 expect "*" expect eof |
代碼: |
Server 19:27:18 Ready_at_07/24/05--19:27 Server 19:27:18 root pts/0 Jul 24 18:48 (cncln.online.ln.cn) |
代碼: |
#!/bin/bash #file_name 2.sh msg_log=/home/wwy/TextQQ/msg.log #msg.log文件 file=/home/wwy/TextQQ/my_msg_log.txt #存放聊天紀錄的文件 QQnum=165165984 #管理員端的QQ號 cmd=`cat msg.log | grep "\[" | tee -a $file | grep $QQnum | tail -1 | awk -F] '{print }'` #----------------------- if [ ! "$cmd" ];then : elif [ ! "`eval "$cmd" 2> /dev/null`" ];then echo 'sorry, your cmd is no display return.' elif [ : ];then eval "$cmd" | xargs fi #----------------------- > $msg_log #清空msg.log,被清空的內容事先保存在my_msg_log.txt 之中 |
代碼: |
#!/usr/bin/expect set QQnum 165165984 #管理員端的QQ號 set shell_script /home/wwy/TextQQ/2.sh #2.sh文件的位置 set run /home/wwy/TextQQ/TextQQ.sh #----------- spawn $run sleep 1 expect "*" sleep 3 expect "*" sleep 3 expect "*" sleep 3 expect "*" sleep 5 #----------- send "/msg $QQnum Ready,waiting_your_cmd,at_[exec date +%R--%D]\r" expect "*" sleep 1 while { set r [exec $shell_script] if { send "$r\r" expect "*" } sleep 3 #內隔3秒檢查一次2.sh是否有返回結果 } expect eof |
代碼: |
./2.exp & |
代碼: |
Server 20:06:27 Ready,waiting_your_cmd,at_20:06--07/24/05 wwy 20:01:18 pwd Server 20:07:09 /home/wwy/TextQQ wwy 20:01:36 ls Server 20:07:19 1.exp 1.sh 2.exp 2.sh classes config.ini err.log jre jre_u lib msg.log my_msg_log.txt readme.txt setenv.bat textqq.bat TextQQ.sh wwy 20:01:54 uptime Server 20:07:39 20:07:39 up 6 days, 11:06, 1 user, load average: 0.00, 0.00, 0.00 wwy 20:02:06 touch tmp Server 20:07:59 sorry, your cmd is no display return. wwy 20:02:43 ls tmp Server 20:08:29 tmp wwy 20:10:24 uname -a Server 20:16:10 Linux Reinnat 2.4.21-4.ELsmp #1 SMP Fri Oct 3 17:52:56 EDT 2003 i686 i686 i386 GNU/Linux wwy 20:11:51 iptables -L -n Server 20:17:40 Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 0.0.0.0/0 0.0.0.0/0 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:135:139 DROP udp -- 0.0.0.0/0 0.0.0.0/0 udp dpts:135:139 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:1433:1434 DROP udp -- 0.0.0.0/0 0.0.0.0/0 udp dpts:1433:1434 Chain FORWARD (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:135:139 DROP udp -- 0.0.0.0/0 0.0.0.0/0 udp dpts:135:139 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:1433:1434 DROP udp -- 0.0.0.0/0 0.0.0.0/0 udp dpts:1433:1434 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) target prot opt source destination wwy 20:17:56 sar 1 1 | sed -n '4p' Server 20:23:53 08:23:53 PM all 0.00 0.00 0.00 3.55 96.45 |