SSH是个好东西

曾经写过SSH隧道的妙用,今天才意识到SSH隧道远不止用来“翻墙”这一个用处,很多常见的应用都可以通过SSH来实现。

比如,SVN的svn+ssh协议,CVS的ext连接模式,rsync的-e参数,这些都可以通过SSH隧道来实现在远程主机上的操作,它们不需要远程主机启动相应的服务或打开相应的端口,唯一的要求就是远程主机可以正常的ssh登录,它们就可以正常的工作。具体的操作不赘述了,很简单,自己man一下就好。

想到这个问题的原因如下:

目前我用的Blog系统是用GNU Emacs和Muse加上一点简单的ASP自己搭建的,所有的文章页面都是在本地生成好后上传上到服务器上,所以需要写Blog时,就一定得用我自己的电脑,进入Linux,打开Emacs才可能完成。如果电脑不在身边或当时正在运行Windows就无法进行Blog创作,这在很大程度上会影响写Blog的积极性,很多时候有想法,却因为环境不Ready就没有写下来,等热情过去了也就放弃了。解决这个问题的方法就是需要把Blog的创作环境放到一个随时可以访问到的地方。网上有很多公共的SSH环境(比如Unix-Center提供的环境),但如果把创作环境放到这些环境中时,数据与本地的同步就会是一个问题。想到用rsync/CVS/SVN等方式来管理,但通常SSH主机又不提供这些服务。这种情况下,直接通过SSH隧道来使用rsync/SVN/CVS就是一个完美的解决方案了。

本文就是通过SSH到我在Unix-Center主机上新搭建的Blog创作平台上撰写的,跟以前一样,还是写完后运行脚本直接上传到网页空间,只不过还要记得在写完后在必要的时候与本地做一次rsync的同步。下一步的目标是确保在手机上也可以发文章,这个可能要麻烦一点,因为手机上虽然能SSH,但SSH后的操作还是很不方便的,所以有必要专门开放一个接口可以直接通过Web的方式进行文章发布,功能不用很强,够用就好。

有些朋友会问,为何要这么麻烦?在Web空间里随便装一个WordPress之类的Blog系统不就可以随时随地随心方便的用了么?嗯……确实是这样,可是这世上有些人就是喜欢没事乱折腾。

雕虫小技:SSH隧道

“雕虫小技”系列文章是一些其实不是什么新鲜玩意但我却是刚刚发现或学会的东西。

访问Wikipedia等网站的困难已经是一个由来已久的问题,常规的解决的方法无非就是用一些**软件,比如Tor就是其中的一个出色代表。不过我不是很喜欢Tor,因为基于类似P2P这样的原理,决定了它不能提供一个稳定的链接,而且Tor的速度我也一直不是很满意。其它的一些解决方案包括使用网页代理、国外SSL代理之类的也是各有长处、各有不足。

其实如果你在国外可以找到一台支持SSH登录,并且可以支持外连的主机的话,用SSH隧道技术就可以很方便的为自己构造一个加密上网的渠道。

假如你有一台SSH主机是somehost.org,用PuTTY等终端程序时只需输入这个主机名和对应登录信息就可以连上去。要实现SSH隧道,非常简单,只需在PuTTY的Connection->SSH->Tunnels中创建一个Dynamic的Foward端口就可以了。比如,我们可以在Source port中输入6500,然后选Dynamic,再点一下Add,在Forwarded ports中就会出现“D6500",这时隧道就设置好了,如果你现在再登陆到这台主机上,你与主机之间就会创建出一条SSH加密的通道,所有你发往本地 6500端口的的请求,都会通过SSH隧道传到对方主机上再发送出去,并把返回的结果也以相同的方式传回来。

PuTTY设置

PuTTY设置

很好,最后一步操作就是在浏览器中设置代理服务器了,设置一个SOCKS(v5)代理,服务器地址用127.0.0.1,端口就是前面设的6500。好了,尽情冲浪吧。

对于类Unix用户,操作更简单,直接ssh somehost.org -D 6500,连上之后一样在浏览器中设上代理就可以了。

SSH隧道其实还可以在很多需要穿越防火墙的情况下提供帮助,留待进一步发现了。

嗯,so far, so good。但是不能忽略了一个问题就是哪里去找国外支持SSH的主机呢?嗯,http://www.red-pill.eu/freeunix.shtml这里有一个很全的列表,提供了很多的免费的Shell Server,不过其中究竟哪些可以支持SSH Tunneling有待各位自己试验了。目前我在用的是silenceisdefeat.org提供的免费服务(但需要通过PayPal捐赠1美元或写传统信件给他们以证明你的邮政地址是有效的),OpenBSD主机,功能比较全,甚至还包括了50M的PHP和MySQL空间(MySQL的权限需要在上面玩它的俄罗斯方块,达到一定成绩才行),但有些时段的速度不是很理想。对于自己有租用国外虚拟主机的朋友,也可以自己试验一下主机是不是支持,据我所知,很流行的DreamHost是可以支持的。

最后顺便提一下Unix-Center网站,一家国内的提供Unix实验环境的网站,提供了Intel/AMD/SPARC下的Solaris和Intel下的Fedora,Ubuntu,FreeBSD以及龙芯上的Debian系统的实验环境,速度还比较理想,而且gcc/make/Perl/Python等开发工具也安装的比较完整,有时想要测试了一下一个程序在不同平台上的表现或是比较一下不同发行版的差异时还是挺好用的。不过Unix-Center的主机都在国内,而且不允许外连,所以用它们是不能完成前面说的做代理的功能的。

Outlook附件检测工具

这篇文章是上个月写的,补发一下。

发邮件时常常会出现邮件中写了要加附件的,结果邮件发出后才想起忘了加附件的事情。Thunderbird有一个插件可以解决这个问题,那就给Outlook也写一个吧,Google一下很快找到了相关的资料,参考着重写了一下,做成了。

下载地址:http://www.freemindworld.com/oac/oac.zip

解包可以得到一个.OTM文件,把它放到%APPDATA%\Microsoft\Outlook中(通常对应硬盘上C:\Documents and settings\\Application Data\Microsoft\Outlook)。如果这个目录已经有一个同名的.OTM文件,请小心行事,因为覆盖它可能会覆盖掉你正在使用的其它脚本。我这个文件是在Outlook 2003上制作和测试的,还没有试过2000或2007上可不可以工作。

打开Outlook,选择“工具->宏->宏…”,这时系统会弹出一个安全警告的对话框,在安全警告中选择“永远信任发布者”并点击“启用宏”,然后点“取消”关闭随后弹出的“宏”对话框。安装成功!

以后发邮件的时候,只要是在邮件正文(不包括回复或转发邮件时引用的原邮件内容)或标题中包含字符串“attach*”或“附件”或“enclos*”,但邮件中没有附加任何附件时,都会弹出对话框询问你是不是真的要发送这封邮件。

跟以前一样,在Google Code上建一个项目:

http://outlook-attachment-checker.googlecode.com

在上面可以下载到源程序,也欢迎有兴趣的朋友参与到项目开发中来。

几点问题说明一下:

1. 由于Outlook加强了安全机制,不签名的VBA是不可以运行的,所以我发布的文件是以我的身份签名的,如果你修改了代码,签名就失效了,这时你需要调整Outlook的安全设置来让你的代码可以运行,或者你必须自己对修改后的代码重新签名。具体的做法可以在这里找到。

2. 部分用户可能会遇到发送邮件时窗口死掉的问题,其实这是由于那个提醒你加附件的对话框弹了出来却被隐藏在了邮件窗口后面,这时可以通过任务栏按钮或Alt-Tab键激活那个对话框,然后做相应的处理。如果这个现象经常出现,可以修改源代码,把最后几行中的:

If MsgBox(promptMsg, vbYesNo + vbDefaultButton2 + vbInformation,
"You may forget the attachment") = vbNo Then

改成:

If MsgBox(promptMsg, vbYesNo + vbDefaultButton2 + vbInformation
+ vbSystemModal, "You may forget the attachment") = vbNo Then

3. 如果你是少数在看到本文前已经试用过这个东东的朋友,并且现在还在使用,请重新下载安装一下这个程序,以前的试用版本有一些BUG,比如,邮件太长时,就会Crash。

豆饭诞生

很自豪的宣布:豆饭诞生了!

实在没有想到这么一个简单的脚本也能引来这么多的眼球,看来把豆瓣和饭否的功能集成起来确实是众望所归,当然,这样的需求仅仅局限在既喜欢豆瓣又喜欢饭否的而且是使用Firefox浏览器那一小群人那里。嗯,长尾

中午时分,饭否网站的Co-founder王兴联系我,表示对我的豆瓣-饭否插件有兴趣,并在试用后进行了一个小小的宣传,很快就不断看到有人加我成为饭否好友。与此同时,报BUG的,提Feature Request的也开始络绎不绝。原本冷冷清清的饭否机器人那里也开始不断有消息进来。我自己粗糙制作的产品一下子暴露在了太多人的目光之下,实在打了我个措手不及。也许,这就是Internet的速度。

下午,饭否网站正式开始支持我这个插件的功能,但是把原本的“通过API”的字样改成什么好呢?我直观的第一反应当然是“通过豆瓣”啦。可是无论是饭否还是我都实在有点担心豆瓣的老大会来找我们的麻烦,毕竟不是豆瓣官方支持的。于是,在否决了“豆瓣非官方插件”这个罗嗦的名字后,我决定把这插件的名字直接改成“豆饭”。虽然不是那么直观,但跟豆瓣上的“豆列”、“豆邮”之类的字眼的风格还是比较相合的。

晚上就开始紧张的投入改进工作,主要是要修掉一些太严重的BUG,并且提供一个添加附注的功能。最后发布了0.2 Beta版,并同时提供了Greasemonkey脚本和xpi的版本。Release Often是互联网应用的一个重要特性,Internet的速度跟传统软件的发布速度完全不是一个概念了。

今天还试用了一下Google Code,果然是非常非常的好用,一申请就开通了,SVN也搭好了,checkout一次就可以开始正式工作了,访问速度也相当快。相比SourceForge那复杂的流程来说,实在是太方便了。当然,相对来说,功能肯定是要弱了不少,但基本的功能却一个也不缺,对于做做小项目真是非常的合适。

目前豆饭以GPLv3协议发布,Google Code的项目页面:http://douban-fanfou.googlecode.com

豆瓣-饭否集成插件

抓虾有“分享到饭否”的功能,为什么豆瓣没有?没有我就给它加上。

看到一个用饭否API给Google Reader实现的插件,很快也模仿着做出了一个在豆瓣上用的插件。目前功能还非常非常的弱,慢慢完善好了,现在什么网络应用都流行一直Beta到底的,嘿嘿。

插件页面:http://www.freemindworld.com/db_ff/index.htm

目前它经被已经列在饭否官方的第三方API应用页面上了,这个页面实际就是一个del.icio.us的书签,Web 2.0时代,要的就是整合:-) 下一步争取稍微在完善一下以后从饭否得到正式的Source ID,这样在饭否上显示出来就不会是“通过API”了,应该会变成“通过豆瓣”之类的字眼。

我这个插件实际上是Firefox的Greasemonkey插件的一个脚本,今天才第一次知道Greasemonkey,相见恨晚啊。Greasemonkey的功能最简单的说就是在访问一个页面时,可以自动附加执行一些脚本,从而实现对页面的一个修改或者扩展。相比自己从头做一个xpi而言,实在是简单多了。

做插件再次体会到Web标准的重要性,豆瓣的页面功能不错,里面却写的不是非常尽如人意,导致我写脚本要分析DOM时多了不少的困难。