本节介绍如何设置您的 POP 客户端软件以使用 ssh 转发的连接。其主要重点是 fetchmail(ESR 出色的邮件检索和转发实用程序),因为这是我发现处理 POP 最灵活的软件。fetchmail 可以在 http://www.tuxedo.org/~esr/fetchmail/ 找到。阅读 fetchmail 附带的优秀文档将对您大有裨益。
以下是我的 .fetchmailrc
defaults
user msingh is manish
no rewrite
poll localhost with protocol pop3 and port 11110:
preconnect "ssh -C -f msingh@popserver -L 11110:popserver:110 sleep 5"
password foobar;
很简单,是吧?fetchmail 有大量的命令,但关键的是 preconnect
行和 poll
选项。
我们不是直接连接到 POP 服务器,而是连接到 localhost 和端口 11110。preconnect
在每次运行 fetchmail 时执行转发,保持连接打开 5 秒钟,以便 fetchmail 可以建立自己的连接。剩下的 fetchmail 自己完成。
因此,每次运行 fetchmail 时,系统都会提示您输入 ssh 密码进行身份验证。如果您在后台运行 fetchmail(就像我一样),这样做很不方便。这就引出了下一节。
ssh 可以使用多种方法进行身份验证。其中一种是 RSA 公钥/私钥对。您可以使用 ssh-keygen
为您的帐户生成身份验证密钥。身份验证密钥可以关联一个密码,也可以不设置密码。是否需要密码取决于您认为您本地使用的帐户有多安全。
如果您认为您的机器是安全的,请继续并使用空白密码。那么,只需运行 fetchmail,上面的 .fetchmailrc
就可以工作了。然后,您可以在拨号上网时以守护进程模式运行 fetchmail,邮件就会自动获取。您就完成了。
但是,如果您认为您需要密码,事情就会变得更复杂。ssh 可以在 agent 的控制下运行,它可以注册密钥并验证在其下建立的任何 ssh 连接。所以我有了这个脚本 getmail.sh
#!/bin/sh
ssh-add
while true; do fetchmail --syslog --invisible; sleep 5m; done
当我拨号上网时,我运行
$ ssh-agent getmail.sh
这会提示我输入一次密码,然后每 5 分钟检查一次邮件。当拨号连接关闭时,我终止 ssh-agent。(这在我的 ip-up 和 ip-down 脚本中是自动化的)
如果我不能/不想使用 fetchmail 怎么办?Pine、Netscape 和其他一些客户端有自己的 POP 机制。首先,考虑使用 fetchmail!它更灵活,而且邮件客户端无论如何都不应该做那种事情。Pine 和 Netscape 都可以配置为使用本地邮件系统。
但是,如果您必须这样做,除非您的客户端具有像 fetchmail 这样的预连接功能,否则您将不得不保持 ssh 端口转发在您连接的整个时间内处于活动状态。这意味着使用 sleep 100000000
来保持连接活动。这可能不会受到您的网络管理员的欢迎。
其次,一些客户端(如 Netscape)将端口号硬编码为 110。因此,您需要成为 root 用户才能从特权端口进行端口转发。这也很烦人。但它应该可以工作。