1

使用场景

线下测试环境,我做了个类似堡垒机的集中登录管理,先将IP与主机名通过host文件做映射,并集中管理到某台服务器(堡垒机),然后用脚本去读取host文件,再用自定义登录命令直接登录的操作,但是我想在登录的时候,可以打印出将要输入的信息,且能自动补全IP或者主机名,避免复制的麻烦

complete设置自动补全

linux自带有这个命令,可以设置bash自动补全的动作,bash终端默认情况下

  • 命令自动补全
  • 变量自动补全
  • 目录自动补全
  • 文件名补全
  • ...

只需要按tab键,我们诸如输入某个命令的前缀字段,就可以模糊匹配出来,但是对于命令的参数补全,没有默认设置
complte 直接输入命令可以查看当前自定义和默认的自动补全

[root@test ~]# complete
complete -o filenames -F __udisks udisks

常用参数

complete参数很多,用法也很多,可以使用man来查看,但是man的内容实在太多,其实实现上述需求很简单,下面简单介绍下几个参数及用法

  • -A action 后面接动作,动作如下

    • alias 别名的命令,将该命令输出来补全命令
    • command 相当于complete -c,将bash的命令名称来补全命令
    • directory 相当于complete -d,获取当前目录下目录名称来补全命令
    • export 相当于complete -e,获取bash变量名称来补全命令
    • file 相当于complete -f,基本上是命令的默认补全,获取当前目录下的文件及目录名来补全命令
    • group 相当于complete -g,获取系统用户组名来补全命令
    • user 相当于complete -u,获取系统用户来补全命令
    • hostname 获取/etc/hosts的主机名来补全命令[注:可以使用该命令来完成需求]
  • -C command 在子shell中执行command内容,并将其内容用来补全命令
  • -G globpat 扩展目录来补全命令
  • -W wordlist 跟参数,将worlist参数用来补全命令[注:也可以使用该命令来完成需求]

完成需求

了解完命令,就很容易实现了,两种方法
1.complete -A hostname ssh

clipboard.png

[root@test]# ssh ptest_21**tab键**
ptest_214 ptest_215 ptest_216 ptest_218 ptest_219

这样就可以补全host主机名然后登录,是不是方便不少呢

2.complete -W 'host1 host2 host3' ssh
我在vim ~/.bashrc里面设置,然后source即可
hn=$(cat /etc/hosts |grep -v '#'|awk '{print $2}')
complete -W "$hn" ssh

如果想把IP补全也加进来
ip=$(cat /etc/hosts |grep -v '#'|awk '{print $1}')
complete -W "$hn $ip" ssh

clipboard.png


青叶
452 声望43 粉丝