menu Chancel's Blog
rss_feed lightbulb_outline

Linux下利用SSH Config管理SSH列表

warning 这篇文章距离上次更新于565天前,文中部分信息可能已失效,请自行甄别无效内容。

相信在Windows下使用SSH有很多同学都会选择很方便的Xshell/MobaXterm等工具,一方面是一般开发人员使用的Linux服务器众多,单独SSH并不好管理也不好记忆众多的SSH服务器,另一方面是有些服务器是使用证书的,不方便登录

MobaXterm挺好用的,免费版本也已经非常良心了,但讲真的Windows下UI好看的SSH工具真的是一款都没有,这一点较之Linux众多拥有极其漂亮Terminal的发行版简直太残忍了,而Windows Terminal虽然很漂亮但要2019年夏季(不跳票)才发布到Windows商店上,稍微美化下PowerShell也可以很好看,加之现在有WSL1.0/WSL2.0加持的Windows做Linux管理甚至取代Linux虚拟机不要太方便。

扯远了,这里着重构筑一下在WSL/Linux环境下,如何方便快捷的使用的SSH Config文件来配置管理多个Linux服务器的SSH列表

SSH Config配置

SSH Config提供了一种不需要安装客户端,只利用SSH的配置文件(~/.ssh/config)达到管理和记录多个SSH连接的目的。

建立第一个Host连接列表

  • 编辑 ~/.ssh/config 文件

      vim ~/.ssh/config
      # 按照如下格式输入,证书位置自指定,我是放在 ~/.ssh/identity_file/ 目录下,此处指明相对路径即可
      Host company
          HostName 192.168.10.1
          User ycs
          Port 10086
          IdentityFile identity_file/company_server.key
  • 授权文件

      chmod 600 ~/.ssh/config
      # 证书文件也需要授权
      chmod 600 identity_file/company_server.key

ssh连接

  • 测试连接

      ssh company
  • ssh config文件的常用参数说明

    • Host - 昵称
    • HostName - IP地址/主机名
    • User - 登录用户名
    • IdentityFIle - 证书文件路径,默认~/.ssh/id_rsa(~/ssh/id_dsa)
    • Port - 端口

需要更多参数详情可以使用 man ssh_config 来查看

列表管理

Python脚本

此时已经配置好简单的SSH连接快捷方式,但仍然有一个问题,配置简单,记住太多Host不容易,好记性不如烂笔头,这里可以提供一个简单的Python脚本 脚本引用自 团子的小窝 - 在 Linux 下管理 SSH 连接,另外该博客提供Bash脚本,详情可以查看链接里的博客,这里仅引用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()

保存此脚本到~/.ssh/目录下,命名为sshs.py脚本,运行脚本测试

chancel@chancel-cp:/mnt/c/Users/ycs10$ python ~/.ssh/ssh.py

************** Hello chancel, Welcome to use SSH Helper Tool **************

+-----+------------------------------+------------------------------------------+
| id  | name                         | address                                  |
+-----+------------------------------+------------------------------------------+
| 0   | local                        | root@192.168.10.21                       |
| 1   | bwh                          | root@bwh.chancel.cn                      |
| 2   | chancel.cn                   | chancel@chancel.cn                       |
| 3   | company                      | ycs@219.136.249.4                        |
+-----+------------------------------+------------------------------------------+

Tips: Press a number betwwen 0 and 3 to select the host to connect, or "q" to quit.

#

Alias别名设置

每次输入Python ~/.ssh/sshs.py?这可一点都不酷

Linux有别名设置的办法,如果还不知道Alias别名命令,可以搜索引擎查看一下,此处不赘述

  • 设置别名(别名可自定义)

      alias sshs = "python ~/.ssh/sshs.py"
  • 使用 sshs 进行测试

      chancel@chancel-cp:/mnt/c/Users/ycs10$ sshs
    
      ************** Hello chancel, Welcome to use SSH Helper Tool **************
    
      +-----+------------------------------+------------------------------------------+
      | id  | name                         | address                                  |
      +-----+------------------------------+------------------------------------------+
      | 0   | local                        | root@192.168.10.21                       |
      | 1   | bwh                          | root@bwh.chancel.cn                      |
      | 2   | chancel.cn                   | chancel@chancel.cn                       |
      | 3   | company                      | ycs@219.136.249.4                        |
      +-----+------------------------------+------------------------------------------+
    
      Tips: Press a number betwwen 0 and 3 to select the host to connect, or "q" to quit.
    
      #
  • 让别名在用户登录时永久生效

      vim ~/.bashrc
      # 在文件最末尾增加
      alias sshs = "python ~/.ssh/sshs.py"

资料参考

团子的小窝 - 在 Linux 下管理 SSH 连接 Yunfeng's Simple Blog - SSH config使用教程和总结

阅读: 171
分类: 操作系统
创建时间: 2019-05-15 11:22:48
更新时间: 2019-12-05 15:44:34
博文目录

[[replyMessage== null?"发表评论":"@" + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageList.data.items.length]])

[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[messageItem.m_environ.browser]] [[messageItem.m_environ.os]] [[messageItem.m_environ.device]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[subMessage.m_environ.browser]] [[subMessage.m_environ.os]] [[subMessage.m_environ.device]]