用GNU screen管理多台Linux主机

需要在Windows下管理一小堆Linux机器,开一堆PuTTY窗口的方式显然是会让人无法忍受的,怎么办?

否决,能不用商业软件就不用商业软件,尤其是在没有人愿意为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。

用GNU screen管理多台Linux主机》上有13条评论

  1. 按照你的配置,各个窗口间切换应该是Ctrl-Z + 0~9吧,直接Ctrl 0~9可以切换么?另外ctrl-z + n/p可以前后切换

  2. 如果运行screen的机器意外重启了,那所有的连接就得重新一个一个手工建立了?

    • screen所在机器重启的话,那screen的session自然是没有了,所以就不能attach到老的session上,只能重新启动screen。重启screen的时候会读.screenrc文件,里面如果已经写了screen ssh user@host1这样的命令,那就自然自动把所有的连接都重新创建好了。当然,这些连接的以前的状态也都没有了,除非,你在每台机器上都跑个screen……

      • 已经很强大了⋯⋯嗯,要是跑在cluster上,主从都用同样的key,如果切换时间够短的话,是不是可以解决重启的问题?

        • 没看懂。把入口screen所在的机器放在cluster中?那种内存和存储都完全同步的VM环境?如果是这样的cluster的话,当然挂掉一台也没关系了,但这样的话跟key不key的就没关系了。
          如果是正常的环境下,把key都配好也不能解决重启和掉线的问题,key只能保证无缝的重连,但重连总是会丢状态的。当然,如果只是短暂的闲置网络中断是不会影响ssh的连接的。

          • 本来是想cluster有机器切换,重连的时候会有key的问题的,但是忽略了screen还要维持状态在内存里面⋯⋯这样的话就只能内存也同步的才行了。

    • 啊,没看到最后,之前我是用expect做的管理一堆机器,可惜缺点是密码明文,当然也可以考虑脚本加密(http://www.datsi.fi.upm.es/~frosal/);或者用 python的paramiko(ssh模块) 做些自动连接管理任务,缺点还是密码明文。


  3. 启动时就打开多个窗口并连接到各远程主机上,并为每个连接所在窗口起个名字
    title host1
    screen ssh user@host1
    title host2
    screen ssh user@host2

    这段代码顺序貌似有点问题,要先screen再title吧。

    • 嗯,已改正。
      从自己的.screenrc中一连串screen和title命令中挎了四行出来改了一下,结果挎的时候正好错位了一行。

回复 Ace 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据