为了访问远程服务器,在windows平台下常用的软件有securecrt、xshell、putty等,这类软件或者收费或者只支持windows平台,对于Linux用户而言,有各种各样的terminal软件,但是相比securecrt这样的商业软件,如终端克隆、自动登陆这样的功能,常见的terminal软件却鲜有支持,本文将介绍如何通过改造默认的terminal打造linux下的’securecrt’,推荐使用terminator或者Yakuake。

  在介绍以下方案前,需要提前做两件事:
1.请在~/.ssh 目录下添加config文件并填入如下内容,如文件已存在,追加即可。


    Host *
    ServerAliveInterval 300
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p
    StrictHostKeyChecking no

2.花费几分钟了解一下expect编程语言,安装tmux工具,安装方法不再赘述。


方案一

Step1:  使用expect实现自动登陆,关键部分代码如下:


    #!/usr/bin/expect -f
    trap {
           set rows [stty rows]
           set cols [stty columns]
           stty rows \$rows columns \$cols < \$spawn_out(slave,name)
    } WINCH

    set timeout 10
    set pin [lindex \$argv 1]
    set token [lindex \$argv 0]

    spawn ssh $user_name@relay00.example.com
    expect  "*relay00.example.com's password:" {
    send "\$pin\$token\n" }
    expect "*example" {
    send "ssh $username@example.com\n" }
    expect "*password*" {
    send "$password\n" }
    expect "*$username@example.com*"
    send "sudo -iu mysql\n"
    expect -re "$"
    interact

根据自己的需要改造这段expect脚本,expect行代表的是交互式登陆时,出现在屏幕上的行,send行表示出现屏幕上的字符串时,你向终端发送什么字符串,通过这个过程模拟交互式登陆。

Step2: Run a custom command instead of my shell
意思是,当我启动这个终端或者新建一个窗口的时候,使用我指定的脚本或者命令代替默认的’sh’ or ‘bash’,如下图所示:
通过这种方式,我们可以自己编写脚本,在新建的终端窗口中实现自动登陆。Terminator终端可以实现水平分隔,垂直分隔,自带的Grouping功能也非常的使用,通过上面的改造,可以实现securecrt软件诸多关键功能。


方案二

在方案一实现自动登陆的基础上,通过Linux下的tmux或者screen实现securecrt的众多功能,本文仅介绍tmux。

Step1:本地终端运行tmux,通过如下脚本,可以实现一次自动登陆若干个远程终端,不需要新建多个窗口。



    #!/bin/bash
    cmd=$(which tmux) # tmux path
    session=example   # session name
    if [ -z $cmd ]
    then
        echo "You need to install tmux"
    exit 1
    fi
    tmux_init()
    {
        #term1 是窗口的名称,根据自己的喜好填写
        #sec是方案一实现的自动登陆程序的名称,根据自己的实际情况填写,自动登陆程序必须放在$PATH路径下
        $cmd new-window -n "term1"  -t $session sec   
        $cmd new-window -n "term2" -t $session  sec
        $cmd new-window -n "term3" -t $session  sec
        $cmd new-window -n "term4" -t $session  sec
        $cmd new-window -n "term5" -t $session  sec
        $cmd selectw -t $session:1
    }

    $cmd has -t $session
    if [ ! $? -eq 0 ]
    then
        $cmd new -d  -s $session sec
        tmux_init
        $cmd a -t $session
    else
        $cmd a -t $session
    fi
    exit 0


这种方案的优缺点如下:

1.自动克隆多个会话,但是受限与SSH本身,最多可克隆10个窗口
2.远程服务端不需要安装tmux。
3.本地网络异常,会话信息不能保存。

Step2:远程服务器运行tmux

代码同上,新建窗口时,去掉后面的调用程序(sec)即可。

这种方案的优缺点如下:

1.自动克隆多个会话,不受SSH限制,可克隆10个以上窗口。

2.本地网络异常,不影响远程服务器上的会话信息。

3.需要在远程服务端安装tmux软件

4.登陆同一远程终端服务器的用户,可以进入并操作你的会话(暂时没有找到解决方案)

相关代码请参考:https://github.com/chaubeau/Tool.git