工作过程中,往往需要连接到不同的服务器上,有些服务器因为处于特定的集群中,可以方便的通过跳板机跳转过去。而有一些开发机、测试机等零散的服务器就需要凭记忆来记住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到相应的机器。