工作过程中,往往需要连接到不同的服务器上,有些服务器因为处于特定的集群中,可以方便的通过跳板机跳转过去。而有一些开发机、测试机等零散的服务器就需要凭记忆来记住IP地址。肯定,这种方式非常麻烦,有些客户端可以用来管理 SSH 连接 ,例如Win下的xshell和putty等。

配置 SSH 连接

这里提供一种不需要安装客户端的简单方法,只利用SSH的配置文件(~/.ssh/config)来记录和管理多个 SSH 连接 。关于~/.ssh/config的配置很简单,随便找个手册了解一下就行。 例如,下面定义了连接到 test 这台机器所需的配置:

# Test host
Host test
    HostName 10.1.1.1
    User admin

一旦在配置文件中写好之后,可以简单地通过"ssh test"来连接到相应的服务器,非常简单。

参考Mac OS X 平台有哪些好用的 SSH 客户端? - 知乎,在上面的基础上再添加以下配置:

Host *
    ServerAliveInterval 60
    ControlMaster auto
    ControlPath ~/.ssh/%h-%p-%r
    ControlPersist yes

下面介绍两种方法来利用配置文件管理好 SSH 连接。

方法一:Python 脚本实现(不推荐)

在此基础上用Python写个脚本,可以提供一个交互式的界面:

#!/usr/bin/python 
# coding=utf-8 

import os
import re

ssh_config_file = '~/.ssh/config'

def parse_config():
    entry_list = []
    entry_name = host_name = user_name = ''

    conf = os.path.expanduser(ssh_config_file)

    if not os.path.exists(conf):
        print 'No such file exists: "%s"!' % conf
        return entry_list, 1

    fp = open(conf, 'r')

    for line in fp:
        line = line.strip()

        if not line or line.startswith('#'):
            continue

        if line.startswith('Host '):
            if entry_name:
                entry_address = '%s@%s' % (user_name, host_name)
                entry_list.append((entry_name, entry_address))

            entry_name = line.split()[1]

            if entry_name == '*':
                entry_name = ''

        elif line.startswith('HostName '):
            host_name = line.split()[1]
        elif line.startswith('User '):
            user_name = line.split()[1]

    if entry_name:
        entry_address = '%s@%s' % (user_name, host_name)
        entry_list.append((entry_name, entry_address))

    fp.close()

    return entry_list, 0

def ssh_helper():
    entry_id = 0
    entry_list, status_code = parse_config()

    if not entry_list and status_code == 1:
        return

    print '''
************** Hello %s, Welcome to use SSH Helper Tool **************
    ''' % (os.environ['USER'])

    print '+-----+------------------------------+------------------------------------------+'
    print '| id  | name                         | address                                  |'
    print '+-----+------------------------------+------------------------------------------+'

    for entry_id, entry in enumerate(entry_list):
        entry_name, entry_addr = entry

        print '| %-3d | %-28s | %-40s |' % (entry_id, entry_name, entry_addr)

    print '+-----+------------------------------+------------------------------------------+'
    print '''
Tips: Press a number betwwen 0 and %d to select the host to connect, or "q" \
to quit.''' % entry_id

    select = ''

    while select != 'q':
        select = raw_input('\n# ')

        if select == 'q':
            break

        try:
            os.system('ssh %s' % entry_list[int(select)][0])
        except (ValueError, IndexError):
            print 'You must press a number between 0 and %d' % entry_id

if __name__ == '__main__':
    ssh_helper()

方法二:Bash 脚本实现(推荐)

将以下内容添加到~/.bash_profile文件中:

# Auto complete ssh server defined in ~/.ssh/config
#complete -W "$(awk '/^Host/{if ($2!="*") print $2}' ~/.ssh/config)" ssh

# Define ssh alias for server defined in ~/.ssh/config
for host in $(awk '/^Host/{if ($2!="*") print $2}' ~/.ssh/config); do
    alias $host="ssh $host"
done

然后 source ~/.bash_profile或者重新登录 shell,直接键入服务器别名,例如test,来ssh到相应的机器。