邮件服务器-邮件系统-邮件技术论坛(BBS)

标题: [转帖]用QQ管理你的系统 [打印本页]

作者: jaffas1101    时间: 2005-7-27 10:13
标题: [转帖]用QQ管理你的系统
用QQ管理你的系统 <br>
2005-7-24 by wwy <br>
######################### <br>
<br>
看过abel大哥的帖子--Shell/Web下发送MSN Message 很受启发 <br>
<a target=_blank href=http://bbs.chinaunix.net/forum/24/050711/575520.html>http://bbs.chinaunix.net/forum/24/050711/575520.html</a> <br>
是利用一个基于命令行的msn客户端实现的 <br>
在这里,换个角度,同样可以利用Linux下命令行QQ客户端 --- TestQQ来实现对系统的管理 <br>
管理员通过自己的QQ与服务端的QQ进行交流,服务器后台用TestQQ+expect+bash 就可以实现很多有趣的功能了 <br>
<br>
TestQQ下载地址:<a target=_blank href=http://formalin14.org/blog/static.php?page=tq>http://formalin14.org/blog/static.php?page=tq</a> <br>
还要有两个OICQ号码,并互相加为好友(一个放在服务端,一个在管理员端) <br>
关于TestQQ的使用方法在 <a target=_blank href=http://formalin14.org>http://formalin14.org</a> 有说明, <br>
其中在配置文件config.ini 中设置好挂在服务端的QQ号,密码和是否隐身等信息 <br>
<br>
实现起来可以有两种考虑, <br>
第一种是以shell脚本为主,即让shell脚本在系统后台监控,当满足一些条件时,调用expect脚本来控制TestQQ,向管理员发特定的消息,发完以后,服务端的QQ就退出; <br>
比如,1.sh脚本用于检测系统的登陆人数,当登陆人数大于0时,调用1.exp脚本,将who命令的结果发给管理员的QQ <br>
<br>
简单的举例: <br>
代码: <br>
<br>
#!/bin/bash <br>
#flie_name 1.sh <br>
if [ `who | wc -l` -gt 0 ];then <br>./1.exp #同目录下的exp脚本 <br>
fi <br><br>
<br>
<br>
代码: <br>
<br>
#!/usr/bin/expect <br>
#file_name 1.exp <br>
set QQnum 165165984 #管理员端的QQ号 <br>
set run /home/wwy/TextQQ/TextQQ.sh #TextQQ的执行文件 <br>
#----------- <br>
spawn $run <br>
sleep 1 <br>
expect "*" <br>
sleep 3 #如果网速慢,可以加大这些sleep <br>
expect "*" <br>
sleep 3 <br>
expect "*" <br>
sleep 3 <br>
expect "*" <br>
sleep 5 <br>
#----------- <br>
send "/msg $QQnum Ready_at_[exec date +%D--%R]\r" <br>
send "[exec who | xargs]\r" #who命令后用到了xargs,是因为TextQQ不支持换行的原因,在这里 "who | xargs" 可以换成其他脚本或命令,来实现更复杂的功能 <br>
expect "*" <br>
expect eof <br><br>
<br>
将1.sh放到计划任务里后,就可以等着来自服务端的消息了 <br>
<br>
管理员端QQ的聊天纪录举例: <br>
代码: <br>
<br>
Server 19:27:18 <br>
Ready_at_07/24/05--19:27 <br>
<br>
Server 19:27:18 <br>
root pts/0 Jul 24 18:48 (cncln.online.ln.cn) <br><br>
<br>
<br>
<br>
第二种考虑是以expect脚本为主,就是将QQ一直挂在服务器后台,一旦满足某些条件,就执行shell脚本,因为expect能控制交互性 <br>
这样做就可以实现管理员向服务端QQ发消息,消息的内容为shell命令,系统做出反应,并将执行结果以QQ消息的形势回复给管理员 <br>
<br>
比如,2.sh脚本用于检查msg.log,这是TextQQ聊天纪录的存放文件,提取其中管理员最新说的话(即命令),执行并返回结果; <br>
<br>
例如: <br>
代码: <br>
<br>
#!/bin/bash <br>
#file_name 2.sh <br>
msg_log=/home/wwy/TextQQ/msg.log #msg.log文件 <br>
file=/home/wwy/TextQQ/my_msg_log.txt #存放聊天纪录的文件 <br>
QQnum=165165984 #管理员端的QQ号 <br>
cmd=`cat msg.log | grep "\[" | tee -a $file | grep $QQnum | tail -1 | awk -F] '{print $2}'` <br>
#----------------------- <br>
if [ ! "$cmd" ];then <br>: <br>
elif [ ! "`eval "$cmd" 2> /dev/null`" ];then <br>echo 'sorry, your cmd is no display return.' <br>
elif [ : ];then <br>eval "$cmd" | xargs <br>
fi <br>
#----------------------- <br>
> $msg_log #清空msg.log,被清空的内容事先保存在my_msg_log.txt 之中 <br><br>
<br>
<br>
<br>
同时,2.exp文件用于将QQ挂在后台,每隔几秒检查一下2.sh是否有结果返回,如果有将结果发给管理员 <br>
代码: <br>
<br>
#!/usr/bin/expect <br>
set QQnum 165165984 #管理员端的QQ号 <br>
set shell_script /home/wwy/TextQQ/2.sh #2.sh文件的位置 <br>
set run /home/wwy/TextQQ/TextQQ.sh <br>
#----------- <br>
spawn $run <br>
sleep 1 <br>
expect "*" <br>
sleep 3 <br>
expect "*" <br>
sleep 3 <br>
expect "*" <br>
sleep 3 <br>
expect "*" <br>
sleep 5 <br>
#----------- <br>
send "/msg $QQnum Ready,waiting_your_cmd,at_[exec date +%R--%D]\r" <br>
expect "*" <br>
sleep 1 <br>
while {1} { <br>set r [exec $shell_script] <br>if {$r!=""} { <br>send "$r\r" <br>expect "*" <br>} <br>sleep 3 #内隔3秒检查一次2.sh是否有返回结果 <br>
} <br>
expect eof <br><br>
<br>
将2.exp放到后台运行即可,等收到Server的“Ready,waiting_your_cmd...”这个消息后,就可以跟Server“聊命令了” <br>
代码: <br>
<br>
./2.exp & <br><br>
<br>
<br>
<br>
聊天纪录举例: <br>
代码: <br>
<br>
Server 20:06:27 <br>
Ready,waiting_your_cmd,at_20:06--07/24/05 <br>
<br>
wwy 20:01:18 <br>
pwd <br>
<br>
Server 20:07:09 <br>
/home/wwy/TextQQ <br>
<br>
wwy 20:01:36 <br>
ls <br>
<br>
Server 20:07:19 <br>
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 <br>
<br>
wwy 20:01:54 <br>
uptime <br>
<br>
Server 20:07:39 <br>
20:07:39 up 6 days, 11:06, 1 user, load average: 0.00, 0.00, 0.00 <br>
<br>
wwy 20:02:06 <br>
touch tmp <br>
<br>
Server 20:07:59 <br>
sorry, your cmd is no display return. <br>
<br>
wwy 20:02:43 <br>
ls tmp <br>
<br>
Server 20:08:29 <br>
tmp <br>
<br>
wwy 20:10:24 <br>
uname -a <br>
<br>
Server 20:16:10 <br>
Linux Reinnat 2.4.21-4.ELsmp #1 SMP Fri Oct 3 17:52:56 EDT 2003 i686 i686 i386 GNU/Linux <br>
<br>
wwy 20:11:51 <br>
iptables -L -n <br>
<br>
Server 20:17:40 <br>
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 <br>
<br>
wwy 20:17:56 <br>
sar 1 1 | sed -n '4p' <br>
<br>
Server 20:23:53 <br>
08:23:53 PM all 0.00 0.00 0.00 3.55 96.45 <br><br>
<br>
<br>
因为在下expect用的太差,而TextQQ本身也有很多局限性,所以有很多不完善的地方,比如只能显示单行和非交互式命令的结果,像more,top这样的命令使用起来会出问题,不过,如果不要回显,一般单行命令都会执行,如rm,iptables等... <br>
关于安全方面,权限就是运行TextQQ时的权限,因为在脚本里有过滤,所以也不用担心别人可以控制服务端的QQ,当然,自己的QQ被盗了除外<br>
<img src="../leadbbsfile/UBBicon/em12.GIF" width=20 height=20 align=absmiddle border=0>




欢迎光临 邮件服务器-邮件系统-邮件技术论坛(BBS) (http://news.5dmail.net/bbs/) Powered by Discuz! X3.2