Linux命令参数自定义补全
使用场景
线下测试环境,我做了个类似堡垒机的集中登录管理,先将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
[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