Eu já vi casos em que até mesmo configurar o ConnectTimeout não funciona. Isso pode ser particularmente irritante ao usar conexões ssh automatizadas para um grande número de servidores. Minha solução é usar um wrapper no lado do cliente que mata o processo ssh se ele não se conectar e retornar com rapidez suficiente. Algo parecido com isto (em perl):
$SshCmd = "ssh server.example.com uname -a";
$TimeOut = 120;
eval {
local $SIG{ALRM} =
sub {
# ignore SIGHUP here so the kill only affects children.
local $SIG{HUP} = 'IGNORE';
kill 1,(-$$);
print STDERR "ssh terminated, max run time of $TimeOut seconds exceeded.\n";
};
alarm $TimeOut;
system ($SshCmd) || die "failed to run $SshCmd: $!";
alarm 0;
};
$SIG{HUP} = 'DEFAULT';
Isso define um alarme de $TimeOut
segundos e mata o filho (o comando ssh) se o alarme for excedido.