需要在Windows下管理一小堆Linux机器,开一堆PuTTY窗口的方式显然是会让人无法忍受的,怎么办?
- 用SecureCRT或xshell
否决,能不用商业软件就不用商业软件,尤其是在没有人愿意为License买单时。虽然xshell个人和教育使用是免费的,功能也足够强大,但我花了N个小时改它和Emacs的配置,还是没有办法在它的终端下完美的使用Emacs,Emacs有那么多变态的快捷键,怎么配总有那么几个快捷键不能正常工作。虽然知道配不好是我自己的错,但能力精力有限,放弃。
- 用第三方PuTTY的外挂或窗口管理器
你真的确信有一个很美好的PuTTY多窗口管理器么?我把PuTTY官网上相关话题中给出的链接中的第三方程序都试了一遍,真没有靠谱的。
想来想去,最终还是决定采用开一个PuTTY窗口,先连上一台Linux主机,然后在上面启动GNU screen再连接到多台主机。
以前对screen的认识,是用来在下载机上运行rtorrent,所以screen的第一个用处是把程序放到后台去运行,不受SSH连接断开的限制,随时连上去都可以恢复到断开连接时的状态,这对于维持一个稳定持久的工作环境很有用。
要让screen可以做为一个多连接管理器,还需要花点精力,这可以通过配置~/.screenrc来实现。
- 让我知道我正在screen环境下工作,并知道我开了哪些连接
hardstatus alwayslastline "%{=b}%{G} Screen(s): %{b}%w %=%{kG}%C%A %D, %M/%d/%Y "
显示状态栏,并列出当前打开的窗口(创建的连接)
- 把screen的默认快捷键由Ctrl-A换成Ctrl-Z
escape ^Zz
在我的Emacs配置中最用不到一个快捷键是Ctrl-Z,所以把screen的快捷键前缀由非常常用的Ctrl-A换成Ctrl-Z,真的需要Ctrl-Z时,只要按Ctrl-Z z就可以了。
- 启动时就打开多个窗口并连接到各远程主机上,并为每个连接所在窗口起个名字
screen ssh user@host1
title host1
screen ssh user@host2
title host2
这样启动screen时就会分别连上host1和host2,把设置好对应的窗口名字,在状态栏上可见。
- 远程连接关闭(或意外断开)时,不要关闭窗口
zombie "^["
默认情况下,一个连接断开后,screen会关闭这个连接所在的窗口,如果要再连就得重新打开新窗口手工创建连接。用了zombie配置后,某个远程连接断开后对应的窗口仍会保留,切换到对应窗口后可以按Ctrl-[手工关闭窗口,也以Ctrl-@重新激活窗口(连接到远程主机)。
- screen启动完成后默认切换回第1个窗口
select 0
完成这一堆配置后,用起来就已经很得心应手了。按Ctrl-Z 0到Ctrl-Z 9可以在各窗口间切换,按Ctrl-Z Ctrl-Z可以在最近两个窗口间跳转。Ctrl-Z d把screen环境放到后台,返回shell。Ctrl-Z c新建一个本地shell窗口。如果需要在多个连接间复制文本,可以用Ctrl-Z <ESC>进入复制/滚屏模式,用回车键设定复制范围,然后用C-z ]贴粘到目标位置。
完成一切设置后,就可以在PuTTY连上终端后执行screen -d -R来创建或连接到screen环境了,用完了可以随手把PuTTY窗口关掉,再连上去时就恢复到上次工作的状态,非常方便。
在我完成了screen的学习和配置后,有人为我推荐了另一个终端复用程序tmux,它比screen的功能更为强大,鉴于screen已经满足了我的需求的前提下,我没有再去折腾tmux,如果你是第一次尝试使用终端复用程序,也不妨试一下tmux。