If I try to connect to a non-existent .local hostname using most utilities, including ping
and telnet
, it times out after 5 seconds:
% time telnet host.example.local
host.example.local: nodename nor servname provided, or not known
telnet host.example.local 0.01s user 0.01s system 0% cpu 5.018 total
This matches the timeout for the .local config in scutil --dns
.
But when I try to ssh
to such a hostname, it never times out. (I just Ctrl-C'd one that was still waiting after 16 minutes.) I can't figure out any existing option in any of the ssh_config files that would seem to affect hostname resolution. The only option I see that seems relevant is "CanonicalizeHostname", and it's not configured in any config file, but I manually set it to "no" with no change in behavior. Adding -v
flags to ssh
doesn't reveal any additional information about hostname resolution beyond the fact that it's "Connecting to host.example.local port 22", which is the last debug line produced.
I tried capturing the MDNS queries for telnet
and ssh
. It appears to make an initial query, then wait 1s and ask again, then again 3s later, etc., each retry waiting 3 times longer than the last. telnet
gave up after three requests (0s, 1s, and 3s), but ssh
got up to the seventh request (0s, 1s, 3s, 9s, 27s, 81s, 243s) before I stopped watching.
I can kind of work around the problem by setting ConnectTimeout 5
in ssh_config (even limiting it to *.local
), but that breaks if the name resolution completes but the remote ssh server is slow to respond.
How can I get ssh
to timeout name resolution in the same manner as other network tools?