实用运维小技巧之 给ssh命令加上自动完成功能


背景介绍:
因为随着项目服务器数量的越来越多,已经快超过1000台了,在Windows上使用PuTTY或XShell就感觉非常低效了。
首先,随着线上服务器的自动伸缩,服务器数量在不断的变化,根本不可能将那么多的服务器都在这些Client工具中进行创建并同步更新,而且记忆这些主机名也会很难。

于是我回归到了使用Linux的命令行终端,通过创建多个alias来满足不同的ssh参数的情况,比如有的需要用key,有的需要用密码;再将所有的服务器添加到某个文本文件中以列表的方式进行更新,同时将其内容作为这些alias的自动完成列表,用起来感觉非常不错。

具体配置:
定义alias
[dong.guo@heydevops ~]$ vim .bashrc

alias sshdevops='ssh -t -i /home/dong.guo/workspace/sshkeys/key_devops -l devops'
alias sshrootpass='sshpass -p "password" ssh -l root'
alias sshrootkey='ssh -t -i /home/dong.guo/workspace/sshkeys/key_root -l root'

创建服务器列表文件,输入所有的服务器主机名
[dong.guo@heydevops ~]$ head -n 10 /home/dong.guo/workspace/autocomp/servers.list

 
idc1-server1
idc1-server2
idc1-server3
idc2-server1
idc2-server2
idc2-server3
idc3-server1
idc3-server2
idc3-server3

给创建的alias加上自动完成功能
[dong.guo@heydevops ~]$ vim .bashrc

# Enable auto-completion of servers via sshdevops, sshrootpass and sshrootkey
function _servers() {
  COMPREPLY=()
  local cur=${COMP_WORDS[COMP_CWORD]};
  local com=${COMP_WORDS[COMP_CWORD-1]};
  case $com in
    'sshdevops')
      local servers=($(cat /home/dong.guo/workspace/autocomp/servers.list))
      COMPREPLY=($(compgen -W '${servers[@]}' -- $cur))
      ;;
    'sshrootpass')
      local servers=($(cat /home/dong.guo/workspace/autocomp/servers.list))
      COMPREPLY=($(compgen -W '${servers[@]}' -- $cur))
      ;;
    'sshrootkey')
      local servers=($(cat /home/dong.guo/workspace/autocomp/servers.list))
      COMPREPLY=($(compgen -W '${servers[@]}' -- $cur))
      ;;
  esac
}

complete -F _servers sshdevops
complete -F _servers sshrootpass
complete -F _servers sshrootkey

使配置生效
[dong.guo@heydevops ~]$ source .bashrc

优雅的敲下TAB键来体验自动完成所带来的快感,如下图所示:
sshdevops

  1. #1 by holyzhou on 2014/04/03 - 00:30

    阅。

  2. #2 by holyzhou on 2014/04/03 - 00:30

    tks

  3. #3 by denny on 2014/06/10 - 02:06

    不错,

    另:你如果用过emacs tramp + bookmarks后的话,肯定会比现在这个惊艳得多。

(will not be published)
*