首页 > 学技术 > 技术网文 > Linux Shell > 正文

[精华] Shell/Web 下發送 MSN Alert/Message


来源 chinaunix.net 酷勤网整理

MSN 通常是用來交談的, Liunx 下最有名的 MSN Client 當屬 gaim,
不過因為它是 GUI 的環境,要以 shell 來應用實在不容易
(如果你能用 shell 控制 mouse 點在那裏就可以做到,但你能嗎 ? ()

1. 安裝 tmsnc (http://tmsnc.sourceforge.net/download.html)
我的例子是用 0.1.1 版本,你可以找別的版本自己開發,或參考我的例子也可以

$>wget http://unc.dl.sourceforge.net/sourceforge/tmsnc/tmsnc-0.1.1.tar.gz
$>tar -zxvf tmsnc-0.1.1.tar.gz
$>cd tmsnc-0.1.1
# 看一下 Makefile , 裏面的 openssl 路徑是否符合你的環境
$>make
$>make install
$>tmsnc   (啟動的樣子)
      .........
    .'------.' |
   | .-----. | |
   | |TMSNC| | |;.
   |*`-----'.|.' `;
   `---------' .;'
  .''''////////;'
 / ######### /;/    The
/ ######### //   textbased
`-----------'   alternative!

Login: abel@twnic.net.tw
Your login-address is abel@twnic.net.tw
Enter password:

2.TMSNC 的指令說明

# tmsnc 的 command 說明 (Readme),如果你要完善你的功能,就要詳讀任何的說明
Availible commands in TMSNC are:
 * help                      show a list of availible commands
 * clear                     clear the screen
 * nick <name>               set your nickname to <name>
 * status <string>           where <string> is online, busy, brb,
 *                            away, phone, lunch or hidden
 * quit                      logout from server and quit TMSNC

 * add <address>             add <address> to the contact-list
 * block <address>           prevent <address> from obtaining your status
 * unblock <address>         reverse the block
 * remove <address>          remove <address> from contact-list
 * window <n> or TAB         change current window to <n>
 * window close or F7        close current window and conversation
 * chat <address> or Enter   start a new conversation with <address>

由以上我們可以知道, tmsnc 我們巳經裝好了,所以就可以來做 shell 發送 msn 的工作了!
用 shell 來發,最好的工具是 expect , 這個工具的說明,你可以在 man page 中找到詳細
解說

3. 
3.1
範例一(簡單版):

#!/usr/bin/expect
# filename=send.exp
log_file ./exp.log
spawn tmsnc -l 你申請的MSN帳號
expect "Enter password:"
send "你的密碼\r"
expect -re ".* can't control me*"
sleep 5

send "/chat [lindex $argv 0]\n"
expect -re ".*!.*"
sleep 1
send "Now: [exec date]\n"
sleep 1
send "[lindex $argv 1]\n"
sleep 3
send "/window close\r"
send "/quit\r"


用法:

#請注意, MSN訊息需為 UTF-8 encoding
$>./send.exp MSN連絡人 MSN訊息


3.1
範例二(稍複雜版):


#!/usr/bin/expect
# log file , for debug
log_file ./exp.log
#設定訊息路經
set workdir "/www/htdocs/html/msn/msg"
# -l 指定 MSN contact, 你可以 tmsnc -h 來了解參數
spawn tmsnc -l 你申請的MSN帳號
sleep 1
# 出現 password 時,送出密碼
expect "Enter password:"
send "你的密碼\r"
sleep 1
# 出現 control me 時,表示 tmsnc 載入完成
expect -re ".* can't control me*"
sleep 3
# 無限迴圈,讀取訊息檔
while {1} {
        sleep 1
#取得 訊息檔中第一行,我個人的定義是 MSN addr
        set msn_addr [ exec cat $workdir/msg.utf8 |  head -1 ]
#如果]有第一行,則回到 loop
        if {$msn_addr!=""} {
#對誰發送說明,指令請看 Readme
                send "/chat $msn_addr\n"
                sleep 1
#出現對話視窗後
                expect -re ".*!.*"
#發送現在時間
                send "Now: [exec date ]\n"
                sleep 1
#發送該檔案的第二行起的訊息,請注意,訊息需為 UTF-8 的 encoding ,您可使用 iconv 來轉換
                send "[exec cat $workdir/msg.utf8 | sed -e 1d ] \n"
                sleep 1
#關]對話
                send "/window close\n"
                sleep 1
#清除訊息檔
                set cmd [exec echo -n "" > $workdir/msg.utf8]
        }
}
send "/quit\r"


現在,我們可以來寫一個網頁程式,來做上例中的 msg.utf8 的處理

<?php
while ( list($key,$val)=each($_GET))
        $$key=$val;
if (isset($smt1)) {
        $msn=iconv("GB2312","UTF-8",$msg);
        $fp=fopen("/www/htdocs/html/msn/msg/msg.utf8",'w');
        fwrite($fp,"$txt1\n$msn");
        fflush($fp);
        fclose($fp);
        system("cat ./msg/msg.utf8");
        echo "
;\n";
}
?>
<html><body>您要加我才能送訊息給你, 請新增 MSN 連絡人: abel@twnic.net.tw
;
測試完後再把我刪了即可, 非常感謝!
;
<form method=GET>
我要傳送給 msn:<input type=text value="<?php echo $txt1;?>" name=txt1>
<input type=text name=msg value="<?php echo $msg;?>" maxlength=255>訊息
<input type=submit value=send name=smt1>
</form> </body></html>


嗯... Good, 如此,你就可以用

$>wget http://你的url/msn.php?smt1=send&txt1=MSN連絡人&msg=MSN訊息

來發放訊息了,實際的例子,您可參考 
http://211.72.210.251/msn/msn.php

5.
實用範例(mrtg)

WorkDir: /www/htdocs/html/mrtg
Refresh: 300
Interval: 5
Language: Big5
Options[_]: growright, noinfo, gauge
#LogFormat: rrdtool
#PathAdd: /usr/bin/
#LibAdd: /usr/lib/perl/

#-----------------------Target Begin------------------------------------
Target[localhost-mysql]:`check_mysqlsh localhost `
MaxBytes1[localhost-mysql]:200
MaxBytes2[localhost-mysql]: 100
Title[localhost-mysql]: 211.72.210.251 MYSQL Threads/Qps Stat
Legend1[localhost-mysql]: 行程數
Legend2[localhost-mysql]: 秒查詢量
LegendI[localhost-mysql]: Threads
LegendO[localhost-mysql]: Qps
YLegend[localhost-mysql]: Threads/Qps
PageTop[localhost-mysql]: <h1>211.72.210.251 MYSQL Threads/Qps Stat</h1>

ThreshMaxI[procmail-mysql]: 30
ThreshMinI[procmail-mysql]: 1
ThreshMaxO[procmail-mysql]: 50
ThreshProgI[procmail-mysql]:/www/htdocs/html/mrtg/alert/mysql_alert.sh
ThreshProgO[procmail-mysql]:/www/htdocs/html/mrtg/alert/mysql_alert.sh

以上的例子是我在監控 mysql 的行程式及查詢量,若行程數超過 30 個,或<=1 個時,或是mysql 每秒
查詢超過 50 個 query, 啟動 mysql_alrtt.sh 程式,而 mysql_alert.sh 程式如下



#!/bin/sh
# mrtg 會傳送三個參數給 ProgI/ProgO , 以利 alert 程式處理
# 分於為 Target name/所設定的警告值/現在的值
target=$1
alert_val=$2
curr_val=$3
wget "http://211.72.210.251/msn/msn.php?smt1=&txt1=MSN連絡人&msg=MRTG 所監測的\
$target,發生問},您所設的現在值 $curr_val 超過您所設的 $alert_val\
\n請您參考 http://你的網頁/$target.html" -O /tmp/msn.log


4. 結語
我個人目前系統的 Alert 都是透過 MSN 來做即時發放的,你可以寫一個檢查系統的程式, check 到有 
alert 狀況時,就可以用 wget .... 來送出訊息給很多相關人員,只要您想送什麼,就可以送什麼,透過
shell 放送,更增您的方便性(當然,也可以送病毒)


註:如果您充份了解 expect 的字串處理,可以反過來,讓 tmsnc + expect 幫您做事哦, 例如和他交談
"exec ls -la /tmp" , 這個 exec 是 prefix, 你只要能拆解出 "ls -la /tmp", 就可以在 msn 中看
到 /tmp 下的檔案列表了 ! 這絕對是真的, 就看你的能力囉
(以上所出現的 email 或 msn address 皆是假的,不要寄信來,不然你會被列入 RBL)



mysql_alert.sh 發送的例子





 sollinux 回复于:2005-07-11 19:01:26

参考!


 初学vb 回复于:2005-07-12 00:00:11

非常不错,值得学习。


 redhat2005 回复于:2005-07-12 15:45:43

我在linux 安装tmsnc ,改的openssl的地址是/usr/include/openssl,
make是提示有错误,那位大哥可以帮助下嘛?还有那位大哥在linux试验成功过啊


 abel 回复于:2005-07-12 16:14:43

Makefile 中的
LIB= -L/usr/lib -lssl -lcrypto -lpanel -lncurses
INC= -I/usr/local/include -I/usr/local/ssl/include -I/usr/include/ssl

 改成
LIB= -L/usr/lib -L/usr/local/openssl/lib -lssl -lcrypto -lpanel -lncurses

INC= -I/usr/local/include -I/usr/local/ssl/include -I/usr/include/ssl -I/usr/local/openssl/include


不然你就在裝一次 openssl 在 /usr 下,就不用改 makefile


 glider126 回复于:2005-07-22 09:58:33

要是能发短消息到手机就好了,呵呵
不过发到msn也是不错的,谢谢你的分享!!


 abel 回复于:2005-07-22 10:14:32

引用:原帖由 "glider126" 发表:
要是能发短消息到手机就好了,呵呵
不过发到msn也是不错的,谢谢你的分享!!


發到手機簡單的很,你只要買點數就好了
廠商會給你 帳號/密碼及相關 api


 b2linux 回复于:2005-07-28 20:55:43

有心人啊,顶下先!


 joecen 回复于:2005-07-29 12:29:27

最好还是装新版的openssl吧,编译一定没有问题.

每次看abel兄的文章总有大的收获!非常感谢你.


 simonat 回复于:2005-11-23 17:48:55

有没有办法获得 contact list?


 archangle 回复于:2005-11-24 09:52:33

用centericq来做更简单.


 comerwang 回复于:2007-01-16 17:24:30

学习,学习!!!!


 新杂人 回复于:2007-01-16 20:06:05

没介绍错, 很好




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=575520
转载请注明作者名及原文出处



收藏本页到: