无缝扩展 IRC 到移动设备
互联网中继聊天 (IRC) 是互联网上仍在积极使用的最古老的实时通信方法之一。由于其普及性、灵活性和跨平台特性,它至今仍拥有非常活跃的用户群。就我个人而言,我从 20 世纪 90 年代末就开始使用 IRC,它非常有用且非常有趣——尤其是 Freenode 上的 #linuxjournal 房间——随时来坐坐!
IRC 的缺点虽然 IRC 非常棒,但有一件事一直困扰着我,而 Jabber 做对了这一点——资源和优先级的概念。在 IRC 中,当您以任何用户身份登录时,您无法从另一台机器再次以该用户身份登录。Jabber 允许多个用户登录,只要“资源”不同,它就会将您的消息路由到优先级最低的客户端。IRC 甚至没有这个概念,所以一旦您在桌面上登录,如果您想在笔记本电脑上登录,您必须以另一个用户身份登录,这导致了很多像“WildBill|Laptop”这样的登录名。如果人们想给您发送私信 (PM),这会造成问题,因为他们永远不知道您使用的是哪个登录名。
多年来,我一直使用一种相当常见的解决方法,在一定程度上绕过这个问题。如果您使用像 Irssi 这样的基于文本的客户端,并在始终在线的机器上运行该客户端,您可以在终端复用器(例如 GNU Screen)中运行该客户端。这使您能够运行客户端,从终端会话中分离,然后通过 SSH 在另一台机器上登录并重新连接到您的会话,在那里您可以赶上您可能错过的任何内容。总的来说,这是一个可以接受的解决方法……除非我忘记登录到 Screen 会话。我曾经有过几天堆积如山的 PM,然后才想起登录查看。到那时,给您发 PM 的人可能已经忘记他们 ping 您的目的是什么了。
这种方案的另一个主要缺陷是它在平板电脑和手机等移动设备上效果不佳。是的,我可以从我的 iPhone SSH 连接到我的 Linux 服务器,并连接到运行 Irssi 的 Screen 会话,但在 3.5 英寸屏幕上的终端模拟器上,屏幕的很大一部分被屏幕键盘占据,这简直是自找麻烦。移动手机上有优秀的 IRC 客户端,例如 iPhone 上的 Colloquy、Android 上的 Yaaic 和 WebOS 上的 wIRC,但如果您在运行 Screen 会话时运行它们,您又会回到上面提到的相同问题,即您最终会得到一个“WildBill|Phone”登录名。肯定有更好的方法。
有更好的方法吗?事实证明,有一天在随便琢磨了一会儿之后,我确实找到了一种方法。Irssi,我通常通过 Screen 和 SSH 使用的文本模式客户端,具有“代理”(或“bouncer”)模式,您可以在其中使其监听几个额外的端口,然后将另一个 IRC 客户端连接到它。启用代理相对容易,并且只需几个命令即可从 Irssi 中完成(假设您的 Irssi 已打包并包含代理模块)。这也假设您已配置 Irssi 以便与您希望代理的任何 IRC 网络正常工作。当然,用您自己的密码替换“mypassword”,定义您想要使用 Irssi 代理的任何 IRC 网络,并选择一个任意的开放端口让代理监听
/LOAD proxy
/SET irssiproxy_password mypassword
/SET irssiproxy_ports linuxjournal=9000
/SAVE
一旦您成功运行代理模块,连接到它就像将另一个 IRC 客户端指向它一样容易。只需在第二个 IRC 客户端的配置中指定运行 Irssi 客户端的主机的完全限定域名,并提供您在上面的 Irssi 命令中调用的密码和端口。此客户端可以是“常规”桌面或笔记本电脑,也可以是移动设备,例如运行 IRC 客户端的 Android 手机或 iPad。
虽然这工作正常,但这让我有点困扰,因为在移动设备和您在 Screen 中运行的 Irssi 会话之间发送的密码是以明文形式发送的。我更希望它是 SSL 加密的,这样就没人可以拦截该密码。不幸的是,Irssi 代理模块不支持 SSL,但可以通过使用 stunnel 实用程序来解决这个问题。
Stunnel 是一个通用的加密包装器,旨在为任何未加密的服务添加 SSL 加密。使用 stunnel 包装 Irssi 代理服务并不难。首先,为了防止外部人员在没有 SSL 的情况下访问代理,我使用以下 Irssi 命令将 Irssi 代理上的端口绑定到环回接口
/SET irssiproxy_bind 127.0.0.1
/SAVE
接下来,使用您的发行版的方法安装 stunnel。在 Ubuntu 10.04 上,一个简单的 sudo apt-get install stunnel4
就可以解决问题。我必须创建一个自签名 SSL 证书(有关操作方法,请参阅“资源”),我将该证书放在 /etc/stunnel 中。接下来,我必须创建一个 /etc/stunnel/stunnel.conf,该文件引用了我创建的证书,并在 stunnel.conf 文件中指定了 Irssi 代理。以下是一个示例(根据需要调整文件路径、“accept”IP 地址和端口)
; stunnel.conf code snippet
; Certificate/key is needed in server mode and optional in client mode
cert = /etc/stunnel/cert.pem
key = /etc/stunnel/key.pem
[linuxjournal]
accept=123.123.123.123:9000
connect=127.0.0.1:9000
因此,前面的代码片段所做的是为自签名 SSL 证书指定证书/密钥文件,然后将 stunnel 的 SSL 端绑定到外部 IP 地址 123.123.123.123 的 9000 端口,它会将数据包传递到我在 127.0.0.1 (localhost) 的 9000 端口上以明文形式运行的 Irssi 代理。此设置的最后一步调整是将移动设备设置为 IRC 连接应为 SSL,现在我有一个安全的代理,我可以使用我选择的任何客户端连接到它。现在我可以从我的常规 Irssi 客户端登录 IRC,但是当我在手机上时,我可以使用 Colloquy 提供的更友好的界面,所有这些都无需在 IRC 上使用不同的昵称。
被“Ping”和收到警报但我仍然有一个问题。我仍然忘记登录 IRC 并查看我的私信——一些朋友堆积了很多“ping”,然后最终沮丧地放弃了。我开始思考,并意识到既然我使用的是手机,那么当我收到 PM 时,可能会向我的移动运营商运行的 SMS 网关发送电子邮件。如果我忘记了,这会提醒我登录 IRC。在互联网上搜索了一段时间后,我发现另一位朋友也有同样的想法。Michael Lustfield 在他的博客中比我在这篇文章中可以写的更详细地解释了这一点(“资源”部分有一个链接),但我将在此处总结他的技术。他有两个 Irssi 脚本:screen-away.pl 监控是否与 Irssi 代理有活动连接,awayproxy.pl 在没有活动客户端连接到 Irssi 代理时,将任何高亮发送到指定的电子邮件地址。

图 1. 在 WebOS 上收到 SMS
“但是 Bill...电子邮件不是 SMS!”您可能会这么认为,但几乎每个移动运营商都可以接受 SMS 消息,以便通过电子邮件传递到手机。就我而言,我使用 AT&T,因此发送到 <myphonenumber>@txt.att.net 的任何电子邮件都将作为短信到达我的手机。因此,我所要做的就是将 Michael 的脚本放入我的 Irssi 脚本文件夹中,调整 awayproxy.pl,使 $config{emailto}
变量为 mymobilenumber@txt.att.net
,然后通过执行 /script load awayproxy.pl
和 /script load screen-away.pl
从 Irssi 中激活这两个脚本。现在,任何我在其中任何频道的提及我名字的消息都会触发 SMS 发送到我的手机,我可以从我的手机或平板电脑登录并加入对话。

图 2. 加入对话——在 WebOS 上使用 wIRC
我们可以重建它,我们拥有技术...这个解决方案虽然完全可用,但并没有我希望的那么优雅。我的“主要”平板电脑和手机都是 iOS 设备(iPad 和 iPhone,但我们先不讨论我对移动设备的选择),Apple 有一个非常简洁、集成的推送通知系统。我开始四处打听,看看是否有任何方法可以将推送消息发送到我的 iDevices,而不是依赖 SMS——这样我的 iPad 也会收到 IRC “ping”。
事实证明,互联网已经为这个问题找到了答案。一位名叫 Chris Jones 的朋友已经整理了一个修补版本的 Irssi 和一个 Irssi 脚本,该脚本为这个解决方案完成了所有繁重的工作。他的网页(参见“资源”)详细介绍了这方面的所有细节以及如何安装它。他甚至提到了将 Irssi 与 stunnel 一起使用!

图 3. 在 iPhone 上收到推送通知

图 4. 查看我之前的通知
总而言之,使用这组脚本确实为我将 IRC 带入了 21 世纪。我喜欢 IRC 的想法,但由于其年代久远,它显示出缺乏移动功能。借助这组脚本和合适的移动工具,您可以使您的 IRC 瘾与时俱进——并随身携带!

图 5. 启动 Colloquy 加入对话
资源Irssi 代理文档:http://www.irssi.org/documentation/proxy
Michael Lustfield 的 Irssi-to-SMS 插件使用:http://michael.lustfield.net/content/irssi-sms
Chris Jones 的 Irssi 代理和 iPhone:http://www.tenshu.net/2010/12/old-and-new-mixing-irssi-and-iphones.html
Stunnel 主页:http://www.stunnel.org
生成自签名 SSL 证书:http://www.akadia.com/services/ssh_test_certificate.html
Jayson Broughton 的“互联网中继聊天”:https://linuxjournal.cn/content/internet-relay-chat
Shawn Powers 的“IRC,仍然是最好的支持”:https://linuxjournal.cn/content/irc-still-best-support-around
Linux Journal IRC 频道:Freenode 上的 #linuxjournal