http://bbs.chinaunix.net/forum/4/050724/582500.html

用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

将1.sh放到计划任务里后,就能够等着来自服务端的消息了

管理员端QQ的聊天纪录举例:
代码:

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)



第二种考虑是以expect脚本为主,就是将QQ一直挂在服务器后台,一旦满足某些条件,就执行shell脚本,因为expect能控制交互性
这样做就能够实现管理员向服务端QQ发消息,消息的内容为shell命令,系统做出反应,并将执行结果以QQ消息的形势回复给管理员

比如,2.sh脚本用于检查msg.log,这是TextQQ聊天纪录的存放文档,提取其中管理员最新说的话(即命令),执行并返回结果;

例如:
代码:

#!/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 之中



同时,2.exp文档用于将QQ挂在后台,每隔几秒检查一下2.sh是否有结果返回,假如有将结果发给管理员
代码:

#!/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

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!