Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

ssh host completion



I have tried to customize ssh completion using zstyle so that it uses only
the host names configured in my ~/.ssh/config file.  I use the following
section in my .zshrc file to try to get the desired behavior:

      if [[ -r ~/.ssh/config ]]; then
         sconf=( $(sed -n '/^Host[=\t ]/{s///;s/#.*//;p;}' ~/.ssh/config) )
         zstyle ':completion::complete:ssh:argument-1:' tag-order !users
         zstyle ':completion::*:ssh:*:' hosts $sconf
         #zstyle -e ':completion::*:ssh:*:' hosts REPLY=$sconf
         #zstyle -e ':completion::*:ssh:*:' hosts reply=$sconf
         # Use ^Xh to see context and tags applicable in CLI position
      fi

Some of my failed zstyle attempts are commented out.  I used the first
zstyle command to eliminate the built-in users completion I didn't
want(!users).  The 2nd remaining zstyle command attempts to give me
hostname completion based on hostnames in ~/.ssh/config.  I know there is a
built-in ssh hostname completion based on /etc/hosts.  I want to remove
that and replace it with the $sconf setting.  I'm not sure how to remove
the built-in hostname completion.

*jbenninghoff@jb-mbpro 1: zstyle*
completer
        :completion:* _complete _ignored
filename
        :compinstall '$HOME/.zshrc'
hosts
        :completion::*:ssh:*: kubeproxy pslab psnode184 ds-cluster-01
aws-ds rs1 rs-sles01 psedge ps135 psnode135 ansible dellclient dellnvme hec
lenovo-sr630 s8 l8s lenovo b143-l8seth0 t1 t2 sles4 sles3 sles2 sles medge
aws-p1 philips phil irs-edge irs aws-ara aws-araceli aws-jb aws-e2 o-prod
oprod odev bhte bhtestedge bht bhtestn1 bhe bhprodedge bh bhnode1
ciscopocedge pocedge ciscopoc poc aws-es aws-m1 aws-e3 aws-mesos mesos
aws-vgutta vg aws-deborah aws-e1 aws-juniper-poc juni aws-indexer labgw
jump cjbox3 ciscojbox2 cjbox2 ciscojbox1 marco marcoaws sandboxsko sandboxd
tron cobbler procurve sandbox4 ps1 ds1 pslab2 kddi pslab1 gracenote gr
jbimpala0 rubi rubicon sandbox3 atsqa trig triggit lab-hdp msftp qa2 qa1
sftp cvprod cvqa cvdev qa3 return dglab1 ibm cent centVM edge vm1 edge1 sm1
edge2 esxv1 esxv2 esxv3 esxv4 esxv5 esxvm1 stackiq hp hpold plat bolt hp2
mbpro firefly cisco16 dell cisco sapporo
tag-order
        :completion::complete:ssh:argument-1: !users

Strangely, zstyle shows the correct list of hostnames in hosts section but
those do not get used when I attempt completion by starting with 'ps' then
tab for example.
I get:

*jbenninghoff@jb-mbpro 1: ssh psnode4*
psnode40     psnode41     psnode42     psnode43     psnode44
psnode40.ps  psnode41.ps  psnode42.ps  psnode43.ps  psnode44.ps

Which are hostnames in /etc/hosts but not in ~/.ssh/config.

When I check the ssh completion in effect right after I type ssh by using
^Xh, I see the below output:

*jbenninghoff@jb-mbpro 1: ssh*
tags in context :completion::complete:ssh::
    argument-1 options  (_arguments _ssh _ssh)
tags in context :completion::complete:ssh:argument-1:
    hosts users  (_ssh _ssh)
    hosts        (_hosts _combination _ssh_hosts _ssh _ssh)
    users        (_users _combination _ssh_users _ssh _ssh)

jbenninghoff@jb-mbpro 1: zsh --version
zsh 5.3 (x86_64-apple-darwin17.0)
jbenninghoff@jb-mbpro 1: type -a zsh
zsh is /bin/zsh


/John


Messages sorted by: Reverse Date, Date, Thread, Author