本文发表在今年一月份的『Linuxpilot』上,已经过了半年,可以放到博客上了。本文基于PAC 2.x版,最近PAC发布了3.0版,界面和功能都有一定的变化。

简介

PAC Manager(以下简称PAC)是一个使用Perl编程语言和GTK图形界面开发套件实现的SSH/Telnet/Serial连接管理工具,是同类的PuTTY、SecureCRT、SSHMenu的一个开源、免费的替代品。

具备哪些特性

  • 可创建本地端口转发、远程端口转发和动态端口转发,并支持X图形界面转发
  • 对连接分组,方便管理较多连接
  • 将指定的、已打开的连接加入集群,同一集群的所有终端共享键盘输入
  • 虚拟终端窗口支持多标签
  • 虚拟终端窗口的样式可定制,支持半透明
  • 支持通过代理服务器建立连接
  • 支持通过Expect表达式进行自动交互
  • 支持使用本地和远程宏管理数量众多且复杂的常用指令
  • 支持定制连接前和断开后自动执行的指令
  • 为每个连接保存截图

针对重要特性的细解

创建SSH隧道

假如当我们在进行诸如收发电邮、使用即时通讯工具聊天或者使用网络银行等网络通讯行为时,也许有些重要的数据我们不希望被明文传递;亦或某些资源受限于网络结构和防火墙等因素而不能被我们直接访问,这时我们往往就可以通过SSH的端口转发功能来实现。

所谓端口转发,即是指将原本使用其它TCP端口访问的数据经由SSH连接占用的端口发送,加之这一过程也伴随有数据的加密和解密,因此也往往被称作“隧道”。根据连接方向的不同,SSH的隧道一般分为三种,即正向隧道、反向隧道和动态隧道;同时,根据端口转发方式的不同,这三种隧道又分别被称为本地端口转发、远程端口转发与动态端口转发。

那么这三种端口转发方式彼此之间有什么异同,分别又都有什么用途呢?这里举个例子来说明一下。

假设我的公司有一个较大的内部网络,而只有一台服务器作为网关对公网提供服务。如果我需要在家里的个人电脑上访问公司的办公系统,而这套系统又部署在内部网络中的一台服务器上、不能被公网访问,该怎么办呢?

第一种情况,假设网关服务器对外提供了SSH服务,那么我就可以在家庭电脑上使用如下指令建立一个隧道:

ssh -L 9999:192.168.1.128:80 111.111.111.111

这条指令中,192.168.1.128是公司办公系统服务器在内网中的IP地址,111.111.111.111是公司网关服务器的公网IP地址。整条指令的意思是:我在家庭电脑中访问本机的9999端口,就如同我在IP地址为111.111.111.111的公司网关服务器上访问IP地址为192.168.1.128的主机的80端口一样。因此,当这条指令执行成功后,我就可以在家庭电脑中通过访问9999端口来打开公司内部办公系统了。

第二种情况,假设网关服务器不对外提供SSH服务但安装了SSH客户端,而我的家庭电脑却安装了SSH服务,那么我就可以在公司网关服务器上执行如下指令建立一个隧道:

ssh -R 9999:192.168.1.128:80 222.222.222.222

这条指令中,222.222.222.222是家庭电脑的公网IP地址。整条指令的意思是:我在公网IP地址为222.222.222.222的电脑上访问9999端口,就如同在本机(公司网关服务器)上访问IP地址为192.168.1.128的主机的80端口一样。当我回到家中,就可以和前面一样通过访问9999端口来打开办公系统了。

事实上,第一种情况是将本地端口映射为远程主机所能访问的资源,故称为本地端口转发;而第二种情况是将远程主机的端口映射为本机所能访问的资源,故称为远程端口转发。

但无论是本地端口转发还是远程端口转发,都只能将一个资源转发到一个端口上,假若我要访问很多资源,岂非要建立很多SSH隧道,不但操作麻烦,而且浪费本机资源。这时,我们就可以使用第三种端口转发方式--动态端口转发:

ssh -D 9999 111.111.111.111

这条指令的意思是:我在本机访问9999端口,就像在IP地址为111.111.111.111的主机上访问它所能访问的某些资源一样。这个所谓的“某些资源”,需要由我在发起访问请求时通过SSH隧道告诉远程主机,事实上,SSH的动态端口转发就是创建了一个SOCKS代理服务器。

在PAC Manager中,我们可以在每个SSH连接的配置界面创建隧道。对于上面的例子,创建本地端口转发时,应点击“Local Port Forwarding”区域的“Add”按钮,并将本地端口、远程资源IP地址和端口分别填写到“Local Port”、“Remote Address”和“Remote Port”中:

截至当前最新的版本(2.4.1.3),PAC Manager尚未为远程端口转发提供像本地端口转发功能一样单独的配置界面,但可以使用高级选项功能实现。在“Advanced Options”输入框中填写如下内容:

如果需要建立多个远程端口转发,可以在“Advanced Options”中填写多个类似上面内容的选项,彼此之间使用空格分隔即可。

创建动态端口转发时,应选中“Dynamic Port Forwarding”区域前面的复选框,然后填写“Forwarded SOCKS Port”即可:

连接前及断开后的自动指令

通过在PAC Manager中定义连接前和断开后的自动指令,我们可以指定一些在相应的SSH连接建立之前及断开之后通常要在本机执行的指令。

例如假设我使用的是计时收费的网络服务,为了节省资费,我希望只在每次建立SSH连接时才激活网络服务,并且在完成工作后断开SSH连接时自动断开网络服务。那么就可以在“Pre Exec”中定义激活网络服务的指令,如下图所示:

在“Post Exec”中定义断开网络服务的指令,如下图所示:

PAC Manager会在每次建立SSH连接前和断开SSH连接后弹出对话框请求用户选择要在本机执行的指令。

Expect正则表达式

Expect是一个用以实现终端中自动交互功能的软件套件,它允许用户通过编写脚本实现自动响应终端中的指令对用户输入的请求,从而将用户从日常重复的劳动中解脱出来。利用Expect,我们可以实现自动输入日常使用的指令中密码的输入;可以在安装程式要求确认时自动确认;甚至实现一个IRC聊天机器人,在你不在时自动回复你的朋友!

那么在PAC Manager中,Expect是怎样使用的呢?我们用一个示例来说明。

假设我是公司内部邮件系统的管理员,每天下班后回到家都要时常查看一下系统的日志记录,而邮件系统服务器位于公司内部网络,我只有公司网关的SSH访问权限。这样我每次查看日志都要做至少三件事:

  • 通过SSH登录到公司网关主机
  • 使用SCP指令从内网邮件服务器上下载日志文件到公司网关主机(需要输入密码)
  • 使用vi编辑器打开日志文件

如果经常这样做,会是件很烦琐的事。那么在PAC Manager中可以这样实现:

首先创建一个到公司网关的SSH连接,然后添加Expect配置如下:

第一个Expect配置项的意思是在到公司网关的SSH连接建立成功后马上从邮件服务器(IP是192.168.1.3)上下载日志文件(mail.log),然后使用vi编辑器打开该日志文件。由于SCP指令需要输入密码,故第二个Expect配置项会在SCP请求密码时自动输入。这样,在PAC Manager中每次连接到公司网关时就会自动下载并打开日志文件了。

对于经常要做远程管理的用户,通常会有一些常用的指令,有时指令太多或太长,记忆和输入都不方便,这时就可以使用PAC Manager的宏管理功能来管理这些常用指令。

例如在下面的图中,我们定义了两个指令:

然后在建立SSH连接后就可以在需要的时候通过右键菜单选择要执行的指令:

如果在编辑宏时选中了输入框前面的“Confirm”,则表示在使用此指令前会弹出一个对话框要求用户确认,对于一些危险的指令,这会是防止自己犯下不可饶恕的错误的最后一道屏障。

集群

如果您有多台远程主机需要管理,并且经常会对所有主机都执行一些相同的操作,那么PAC Manager的集群功能就可以免去在每台主机上都执行一遍相同指令的麻烦。

首先我们打开三个SSH连接,假设现在需要在其中的两台主机中输入同样的指令,那么可以点击PAC Manager主窗口上的“Clusters”按钮,在弹出的对话框中的集群列表中新建或选择一个集群。

在对话框左边的列表中列出的是当前所有打开的连接中没有被加入集群的连接,选中其中的两个,并点击“Add to Cluster”,这两个连接即被加入指定的集群中。如下图所示:

同一集群中的所有终端窗口将共享用户的输入,例如在集群中的任一终端中输入“hostname”并点击Enter键,则集群中所有终端都会显示该连接对应主机的主机名。

环境变量及用户自定义变量

PAC Manager允许用户在定义宏、Expect脚本和其它指令时使用系统环境变量和自定义的变量。对于某些需要用到会经常变化的特定值的指令,这个功能免去了每当这些值变化后都必须逐个修改相关指令的麻烦。

以前面在“Expect正则表达式”节举的例子来说,假设我不但定义了连接后自动下载日志文件的Expect表达式,还定义了几个使用lftp指令下载远程主机其它文件的宏,那么每当远程主机的FTP账号密码发生变化,我都必须逐个修改所有使用了这个密码的宏,设想如果这种情况很多,那将会是怎样的噩梦!

此时我就可以使用自定义变量的功能定义一个变量,以存储这个密码,如下图所示:

然后在所有使用这个密码的位置使用这个变量作为替代值。查找已定义变量的方法是在指令输入框中点击右键,所有的用户自定义变量都显示在“User variables”菜单中:

如果需要在指令中引入系统环境变量,则可以在与“User variables”平级的“Environment variables”菜单中选择。

灵活的可定制性

PAC Manager提供一个简洁直观的全局定制界面,用户可在其中定义程式本身行为的参数、建立连接后的虚拟终端窗口的样式、连接的超时时间及建立连接时使用的代理服务器信息。

它甚至为每个连接都提供了定制功能,用户可以针对个别连接进行个性化定制,单个连接中的配置信息将会覆盖全局配置中对应的信息。

管理Telnet/Serial连接

PAC Manager不但支持SSH协议,也可以作为Telnet和Serial协议的连接管理工具,在此不作赘述。

结束语

PAC Manager是一个年轻的项目,在用户体验和功能上还有很大的发展空间。但凭借出色的用户界面设计和实用细致的功能,即使与那些老牌的同类工具相比也不遑多让,从它华丽的现身我们高兴地看到在SSH/Telnet管理工具中又多出一个易用、强大、美观和免费的选择。

Posted via UltraBlog.vim.