2007年8月31日

穿透HTTP代理用 python-xmpp 给 google talk 发消息

python-xmpp 实现了 jabber 的大部分协议,能够用 python 发 jabber 消息
因为 google talk 本身就是基于 jabber 协议扩展的,所以也能给 google talk 发消息


早期的 python-xmpp 不支持 SSL 认证登录,所以只能登到一些非SSL认证的服务器,如 Jabber.org ,再给 google talk 的用户发消息,新版本已经解决这个问题。我现在使用的版本里 auth.py 是 v 1.35 2006/01/18 19:26:43
auth的参数是(节点,密码)
j_CLIENT.auth('shaozx','password')
第一次写的时候传入了 user@gmail.com 导致程序报错,后来跟踪调试,找到了第 143行,
它的本意是通过 user@gmail.com 截断得到 gmail.com,然后 DNS 解晰得到实际服务器 talk.l.google.com,
最后组合得到 user@talk.l.google.com,可是程序里几个变量都叫 server ,把自已也搞糊了!
140 if "DIGEST-MD5" in mecs:
141 node=Node('auth',attrs={'xmlns':NS_SASL,'mechanism':'DIGEST-MD5'})
142 elif "PLAIN" in mecs:
143 sasl_data='%s\x00%s\x00%s'%(self.username+'@'+self._owner.Server,self.username,se lf.password)
144 node=Node('auth',attrs={'xmlns':NS_SASL,'mechanism':'PLAIN'},payload=[base64.enco destring(sasl_data)])
145 else:
146 self.startsasl='failure'
147 self.DEBUG('I can only use DIGEST-MD5 and PLAIN mecanisms.','error')
148 return



我现在使用的python-xmpp里带的 transport .py 版本是 transports.py,v 1.28 2006/01/26 13:09:35
我修改屏蔽了第 182 行,否则使用代理服务器的时候总是报错,无法认证成功,还没想明白为什么
172 def send(self,raw_data):
173 """ Writes raw outgoing data. Blocks until done.
174 If supplied data is unicode string, encodes it to utf-8 before send."""
175 if type(raw_data)==type(u''): raw_data = raw_data.encode('utf-8')
176 elif type(raw_data)<>type(''): raw_data = ustr(raw_data).encode('utf-8')
177 try:
178 self._send(raw_data)
179 # Avoid printing messages that are empty keepalive packets.
180 if raw_data.strip():
181 self.DEBUG(raw_data,'sent')
182 #self._owner.Dispatcher.Event('', DATA_SENT, raw_data)
183 except:
184 self.DEBUG("Socket error while sending data",'error')
185 self._owner.disconnected()


如果是直接连接互联网,connect的写法如下:
j_CLIENT.connect()
中间如果有代理服务器,connect的写法如下:
j_CLIENT.connect(proxy={'host':'192.168.1.254','port':8080,'user':'guest','password':'cisco'})
注意 port 变量是整型,用程序代码生成proxy的时候格外要注意,不然会报错
可以参考 python-xmpp 的API文档


如果从命令行或其它地方传入文本,还需要注意编码转换
msg = unicode(msg,'gb18030').encode('utf8')
然后再发送出去
j_CLIENT.send(xmpp.Message('接收者',msg))


sendInitPresence(50)是置发送者状态为“在线”,置发送者状态后接收方会多弹出一个“XXX上线”的消息,我遇到过Palm上的一个jabber客户端,登录成功后就置了一个 0 ,然后死活发不出去消息,晕倒!


自带的程序原型 xsend.py 简化如下:
#!/usr/bin/python
# -*- coding: utf8 -*-
import xmpp

j_CLIENT=xmpp.Client('gmail.com',debug=[])
j_CLIENT.connect(proxy={'host':'192.168.1.254','port':8080,'user':'guest','password':'cisco'})
#j_CLIENT.connect()
j_CLIENT.auth('shaozx','password')
#j_CLIENT.sendInitPresence(50)
j_CLIENT.send(xmpp.Message('shaozx@gmail.com','test'))


写python的东西感觉架着滑翔机,
对老手来说是一种享受,而新手战战兢兢如履薄冰
最后祝你好运!

修正 libgmail 报HTTP Error 400: Bad Request 的 BUG

前段时间写了一个检查邮件的 python 脚本,调用 libgmail

这几天发现不能用了,总是报 HTTP Error 400: Bad Request

上网搜了一下,是因为 gmail 把 URL 改了,(越来越不厚道了)

来源:http://www.thescripts.com/forum/thread696534.html

修改 libgmail v0.1.5.1

第 317 行
try:
link = re.search(RE_PAGE_REDIRECT, pageData).group(1)
redirectURL = urllib.unquote(link)

增加一行,变成:
try:
link = re.search(RE_PAGE_REDIRECT, pageData).group(1)
redirectURL = urllib.unquote(link)
redirectURL = redirectURL.replace('\\x26','&')
---

2007年8月30日

SSH的常见使用方法

telnet已经是非常古董级的产品,老的telnet都是明文传送数据(包括密码),很容易被网络上的其它节点监听导致泄密,新一点的telnet加了一层SSL传输加密但是支持不是很广泛。

这里介绍一些SSH命令和使用方法,详细的配置和参数说明可以参考相关的手册。
1、登录
2、使用证书登录
3、穿透防火墙
4、文件拷贝
5、目录挂载



1、登录时指定用户名和主机
ssh 与 telnet 有些不同。后者会提示你输入用户名,而前者默认使用当前的登录用户名,但是大部分情况下,远端要使用的用户名都不是本地登录的用户名
可以用如下方法指定用户名

ssh -l user host

ssh user@host

然后系统才会提示你输入 user 用户的密码。
如果是第一次登录该主机,在输入密码前还会看到一段提示你是否接受密钥的对话,输入 yes 按受即可


2、用证书登录
用证书登录可以不用每次手工输入密码,只需要输入 ssh user@host 就直接进入服务器,因此可以将服务器端的密码设得很复杂以提高安全性,但是一定要保护好客户端的证书。
使用证书登书方式需要2份证书文件:
一份放在本地的 $HOME/.ssh目录下面,id_rsa,有点象IC卡钥匙
另一份放在任意多的主机上面,好比IC卡锁,id_rsa.pub

证书文件一般放在 $HOME/.ssh 目录下面,如果你还没有这个目录或者这个目录下没有任何文件,就需要生成新的公钥私钥
在客户端执行:
ssh-keygen -t rsa
(一路回车即可)
会在 $HOME/.ssh 下面产生两个文件
-rw------- 1 biff biff 1671 2007-08-30 10:46 id_rsa
rw-r--r-- 1 biff biff 395 2007-08-30 10:46 id_rsa.pub
id_rsa是私钥,安全级别较高,只允许本人查看
而 id_rsa.pub 是准备送到其它服务器上去的,给别人是没关系的。

有了证书以后就需要把公钥放到服务器上去
ssh-copy-id -i id_rsa.pub user@server
这条命令会提示你输入远端user用户的密码,然后将公钥追加到远端用户$HOME/.ssh目录下面的authorized_keys文件里
遇到新的SSH服务器以后,只需要执行这一步就行了,千万不要重新生成密钥,不然前面的那些主机就又不认得新密钥了

然后试试 ssh user@host ,就可以直接进入,不会再提示你输入密码了。
不过有个例外!如果远端服务器的用户名与密码相同,你使用密钥登录就不会成功


3、穿过代理服务器 ( 摘自 Open SSH Client 官方文档 )
ssh本身不能穿透代理服务器,需要配合其它的程序进行转发
在 fedora 中,检查是否已经安装了 nc ( netcat ),在 $HOME/.ssh/config 文件中增加一行

ProxyCommand nc -X connect -x 192.168.2.67:808 %h %p

如果你是使用SOCKS代理,则需要把上面的"connect"换成"4"或者"5",这个"4"或者"5"对应你的SOCKS代理的版本。

在Debian 3.2和Ubuntu 6.06中你可以使用connect-proxy程序来连接HTTP代理。首先得安装这个connect-proxy软件包,然后在 ~/.ssh/config 文件中增加类似这样的一行:

ProxyCommand connect-proxy -H 192.168.2.67:808 %h %p

如果你是使用SOCKS代理,则需要把上面的"-H"换成"-S"。

Mandriva 2006与Debian 3.2的情形类似,只是它的软件包和程序的名字都叫connect,作相应的修改就可以了。

( 我在 Ubuntu gutsy 下面穿透 http-proxy 成功 )


4、文件拷贝
如果服务器有ssh服务,就等于一条带加密的FTP传送带,可以进行文件拷贝了。
scp ./file1 user@server:path/file1
将当前目录下的 file1 文件复制到server主机的user用户下 path目录下
反之亦然,可以将远程文件复制到本地


5、挂载远程目录
如果服务器上开启了ssh服务,就可以将服务器上的目录挂载成本地目录,然后就可以直接用 cp / rm 之类的本地文件操作命令来操作远程文件,也能直接用 vi 等命令对远程文件进行编辑,跟操作本地文件一样方便。参考 http://www.pkblogs.com/binsos/2007/06/linux.html

2007年8月10日

中国人在复制什么?

一直在用 Gaim,今天试了一下 Gajim ,印象里这个软件是可以语音的,但是不行

然后上 google 搜了一下 "google talk linux 语音"

呵,好家伙,满满的一屏全是一样的标题:“Linux将可以跟Google talk 语音通话了”

这是我很久很久以前在 linuxfans 论坛上发的一则新闻,

有史以来我也就发过这么一次,而且内容还是从英文网站摘来的

抄也就罢了,竟然很少引用了原文出处的!

我算是有点公德心的,每次引用总是小心意意的加上原文出处,即使忘记了也会再去搜一次

又想起前次那个“昨天,财务找我”的段子

最后的感想是:互联网出名其实很容易,但是不一定是你的名字!

----------------------------

唠叨归唠哪,细看了一下 Google 搜索的排名

我在 Ubuntu China 新闻组里发的贴基本上能排上前几位,

而实际情况是:这些有点内涵的贴子都是从我的 blog 上转贴过去的

访问量排第一

----------------------------

记得看过一则新闻, Google 正在修改排名的算法

也就是文章排序的先后顺序是按登出时间的先后进行排列

还有正在研发的原创登记,让作者认领自已的原创进行标记

“中国在复制世界”的神话还能走多远?

2007年8月6日

在脚本里用 date 命令获得昨天或明天的日期

UNIX 下面写脚本经常要用到取日期,比如当前应用系统的日期是 2006/07/25,就需要计算出明天的日期2006/07/26,然后根据计算得到的日期做一些预处理,比如日期切牌这类的操作。

在 UNIX 环境下,我一直都是传一条 SQL 给数据库,比如 informix 下(oracle类似):

nextday=`dbaccess $SCH_DBS <<! 2>dev/null | cut -d' ' -f2
output to pipe 'grep -v ^$'
select first 1 date+1 from time_table;
!`

test $? && exit
echo $nextday


LINUX 就不必这么麻烦了。
今天看到一篇介绍 linux date命令 的文章,这里介绍的方法你绝对没试过:


假设计算机日期是 2007/08/06 ( 格式化的处理自已搞定,就是 %Y%-m-%d之类的,我就不罗嗦了)

昨天:
date --date='yesterday'
2007年 08月 05日 星期日 19:02:25 CST

前天:
date --date='1 days ago'
2007年 08月 04日 星期六 19:06:34 CST

半小时后: -30 minutes ;上一小时: 1 hour ago;上个月: 1 month ago ;去年:1 year ago


明天:
date --date='next day'
2007年 08月 07日 星期二 19:10:12 CST

date --date='-1 days ago'
2007年 08月 07日 星期二 19:08:51 CST

半小时后: 30 minutes ;下一小时: 1 hour;下个月: 1 month ;明年:1 year 一个月零五天: 1 month 5 day


有意思吧!想想还需要什么功能?

下周:
date --date='1 week'

周未:
date --date='this sunday'

变态组合一下:
date --date='-30 minutes -2 weeks +2 months'

?? 怎么解释?? (把飞机票送过来,时间是)在两个月提前2周半小时 ...... 够变态的!!


这还不够,还需要传入自已给定的时间作参数,计算指定日期时间之前或之后的时间:

我儿子十岁生日:(中国人的习惯是十周岁提前做,嘻嘻)

date --date='2008-08-08 08:08:08 UTC+8 +8 year -8 months' +'%F %T'
2015-12-08 08:08:08

呵呵,这句话的解释是 ^_^ ??

你自已折腾去吧。。。。。



二进制生存 http://www.pkblogs.com/binsos

2007年8月5日

理性看待LINUX桌面应用的现状

-----------------------------
引自 SUSE中文组
http://groups.google.com/group/SuSE_Chinese/browse_frm/thread/213b86da2f1425e4
>很多"全日制"Linux使用者都是网络管理员或程序开发员, 特别是对开发UNIX程序的程序员来说,Linux绝对是利器。

最后一句话是对的 其它都是在胡说
楼主 windows够易用了 linux有些地方不得不打命令 windows不得不打命令的地方很少 因为图形界面出来的早 完善的多了 家用的时
候完全不用打 这让刚接触电脑不久的人没恐惧了
你说的这种情况见证了windows的脆弱性 因为windows的文件结构很不清晰 也不划分开来 内核 驱动 管理工具 命令行全挤一起 你装个什
么软件它就变慢了 你用一段它就快挂了
你是转载的还是杜撰的啊?如果都不是 那你真强 我对你的敬仰之情犹如滔滔江水连绵不绝 也不至于玩到这地步吧
------------------------------

我从98年开始接触LINUX,但一直仅限于接触,只是装装看看,了解一下LINUX的发展状况。


参加工作以后,大概是2001年,工作比较闲的时候就开始用Linux架一些http\ftp\dns之类的服务,感觉linux在服务器方面大有作为,但是身边一直没有成功的案例。当然,这也代表着国内LINUX应用的当时的现状--说的多、用的少。

直到2004年才见到第一个案例,是我的一个同事用redhat as4架了一个日报社的web站点(http://www.cb315.com),用的jsp/tomcat。



2005年的时候遇到了suse 10.0,感觉眼前一亮,这才是第一个让我感觉能够真真使用的桌面版LINUX,在5月份的时候,装了win/linux双系统,基本上停在linux下面不进windows了。

当时我是在杭州做一个银行BI项目的开发,工作相对简单--UNIX C编程,只需要telnet就行了,gnome-terminal多标签当然是这方面的利器。

2006年的时候又接触了sshfs和ftpfs,能够将HP-UNIX的远程目录挂载成Linux的本地目录,这样就能够用VIM编辑C程序,不用再受罪忍受标准UNIX-VI了,而且经过一年的使用和学习,自已也写了一些shell脚本用于日常使用,这更增加了对linux的依赖。

这时候已经从“windows是不可或缺的后盾”转变成“进了windows就不适应”。

2006年应该是转折性的一年,从这时候开始,基本上都是在虚拟机里面使用windows,用虚拟机主要还是office和erwin解决不了。


我是绝对的Linux支持者,但还不至于让狂热冲昏头脑,

目前linux服务器应该已经走向实用阶段,虽然标准化和易用性方面已经无人可及,但是在高端应用特性和硬件驱动支持上还是比不上专用的UNIX系统

但是桌面,还仅仅是一个启步。虽然有一些电脑厂商开始预装LINUX,但是这些经过精心处理得"很象windows"的linux仍然是只是能用,并不够用和好用。

WINDOWS仍然占领着主流操作系统市,非IT技术人员对其知之甚少,大部分用计算机的人其实并不知道LINUX的存在。

MS OFFICE套件仍然占领着主流市场,Linux下的相关软件只能兼容,但是无法改变用户的使用习惯和第一体验。就比如很多接触永中office的人都称赞它做得棒,就是因为它做得跟ms office一个样,符合用户的习惯,其实它的功能和应用的广泛性不一定比得上open office

IE,这是一个不能不说的痛,特别是在国内,网银ActiveX的应用,就不多说了。另外,Firfox2.0在速度上超过了ie6,但是感觉还是不及ie7,但这中间可能有IE是集成在系统内核中的原因,但是ff的插件绝对是一流的

IM上面,QQ经常连不上,MSN和GT的语音功能还不完善,路还很长。