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