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

Re: Bug#570951: zsh: ssh completes to non-resolvable hostname from .ssh/known_hosts



On Mon, Feb 22, 2010 at 02:09:15PM +0100, Vincent Lefevre wrote:
> When I do "ssh pru[TAB]", ssh completes to a non-resolvable hostname
> from the .ssh/known_hosts file: prunille.vinc17.org
> 
> In fact this machine is resolvable only from my local network, and
> it is an error to assume that a host key in .ssh/known_hosts is
> necessarily resolvable (it may be there just to check the key thanks
> to a HostKeyAlias declaration). IMHO, if the key is listed as an alias
> from .ssh/config but not as a Host identifier, it should be discarded.
> Hosts from .ssh/config should be used instead. The algorithm would be:
> 
> 1. Take all host identifiers after Host declarations from .ssh/config
>    (strings with '?' and/or '*' should not be taken into account).
> 2. Add all hosts from .ssh/known_hosts that are not an argument of
>    a HostKeyAlias declaration (if hosts are in fact hashes, due to
>    HashKnownHosts, they should not be taken into account).
> 
> For instance, if .ssh/config has:
> 
> Host myhost
>   HostKeyAlias my-real-host-name.mydomain
>   Hostname gateway.mydomain
>   Port 12345
> 
> then "ssh my[TAB]" should complete to myhost only.
> 
> Of course, as a workaround to the current behavior, the user could
> write:
> 
> Host myhost my-real-host-name.mydomain
>   HostKeyAlias my-real-host-name.mydomain
>   Hostname gateway.mydomain
>   Port 12345
> 
> but this can make maintenance of the config file less easy.

One other potentially-complicated issue is the known_hosts file
gaining syntax in the form of

[localhost]:2222,[127.0.0.1]:2222 ssh-rsa keyfingerprintblahblah id

resulting in tab completion of \[localhost\]:2222 as a host.

I'm sure there is a better solution, but dropping entries with brackets
seems like an improvement over the status quo.

Index: Completion/Unix/Type/_hosts
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_hosts,v
retrieving revision 1.10
diff -u -r1.10 _hosts
--- Completion/Unix/Type/_hosts	5 Apr 2006 10:04:32 -0000	1.10
+++ Completion/Unix/Type/_hosts	28 Feb 2010 21:35:11 -0000
@@ -41,9 +41,9 @@
 
     for khostfile in $khostfiles; do
       if [[ -r $khostfile ]]; then
-        khosts=(${(s:,:)${(j:,:)${(u)${(f)"$(<$khostfile)"}%%[ |#]*}}})
+        khosts=(${${(s:,:)${(j:,:)${(u)${(f)"$(<$khostfile)"}%%[ |#]*}}}:#*[\[\]]*})
         if [[ -z $useip ]]; then
-	  khosts=(${${khosts:#(#s)[0-9]##.[0-9]##.[0-9]##.[0-9]##(#e)}:#(#s)[0-9a-f:]##(#e)})
+	  khosts=(${${${khosts:#(#s)[0-9]##.[0-9]##.[0-9]##.[0-9]##(#e)}:#(#s)[0-9a-f:]##(#e)}:#*[\[\]]*})
         fi
         _cache_hosts+=($khosts)
       fi



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